Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0+
0002 /*
0003  * Copyright 2017 Impinj, Inc
0004  * Author: Andrey Smirnov <andrew.smirnov@gmail.com>
0005  *
0006  * Based on the code of analogus driver:
0007  *
0008  * Copyright 2015-2017 Pengutronix, Lucas Stach <kernel@pengutronix.de>
0009  */
0010 
0011 #include <linux/clk.h>
0012 #include <linux/of_device.h>
0013 #include <linux/platform_device.h>
0014 #include <linux/pm_domain.h>
0015 #include <linux/pm_runtime.h>
0016 #include <linux/regmap.h>
0017 #include <linux/regulator/consumer.h>
0018 #include <linux/reset.h>
0019 #include <linux/sizes.h>
0020 #include <dt-bindings/power/imx7-power.h>
0021 #include <dt-bindings/power/imx8mq-power.h>
0022 #include <dt-bindings/power/imx8mm-power.h>
0023 #include <dt-bindings/power/imx8mn-power.h>
0024 #include <dt-bindings/power/imx8mp-power.h>
0025 
0026 #define GPC_LPCR_A_CORE_BSC         0x000
0027 
0028 #define GPC_PGC_CPU_MAPPING     0x0ec
0029 #define IMX8MP_GPC_PGC_CPU_MAPPING  0x1cc
0030 
0031 #define IMX7_USB_HSIC_PHY_A_CORE_DOMAIN     BIT(6)
0032 #define IMX7_USB_OTG2_PHY_A_CORE_DOMAIN     BIT(5)
0033 #define IMX7_USB_OTG1_PHY_A_CORE_DOMAIN     BIT(4)
0034 #define IMX7_PCIE_PHY_A_CORE_DOMAIN     BIT(3)
0035 #define IMX7_MIPI_PHY_A_CORE_DOMAIN     BIT(2)
0036 
0037 #define IMX8M_PCIE2_A53_DOMAIN          BIT(15)
0038 #define IMX8M_MIPI_CSI2_A53_DOMAIN      BIT(14)
0039 #define IMX8M_MIPI_CSI1_A53_DOMAIN      BIT(13)
0040 #define IMX8M_DISP_A53_DOMAIN           BIT(12)
0041 #define IMX8M_HDMI_A53_DOMAIN           BIT(11)
0042 #define IMX8M_VPU_A53_DOMAIN            BIT(10)
0043 #define IMX8M_GPU_A53_DOMAIN            BIT(9)
0044 #define IMX8M_DDR2_A53_DOMAIN           BIT(8)
0045 #define IMX8M_DDR1_A53_DOMAIN           BIT(7)
0046 #define IMX8M_OTG2_A53_DOMAIN           BIT(5)
0047 #define IMX8M_OTG1_A53_DOMAIN           BIT(4)
0048 #define IMX8M_PCIE1_A53_DOMAIN          BIT(3)
0049 #define IMX8M_MIPI_A53_DOMAIN           BIT(2)
0050 
0051 #define IMX8MM_VPUH1_A53_DOMAIN         BIT(15)
0052 #define IMX8MM_VPUG2_A53_DOMAIN         BIT(14)
0053 #define IMX8MM_VPUG1_A53_DOMAIN         BIT(13)
0054 #define IMX8MM_DISPMIX_A53_DOMAIN       BIT(12)
0055 #define IMX8MM_VPUMIX_A53_DOMAIN        BIT(10)
0056 #define IMX8MM_GPUMIX_A53_DOMAIN        BIT(9)
0057 #define IMX8MM_GPU_A53_DOMAIN           (BIT(8) | BIT(11))
0058 #define IMX8MM_DDR1_A53_DOMAIN          BIT(7)
0059 #define IMX8MM_OTG2_A53_DOMAIN          BIT(5)
0060 #define IMX8MM_OTG1_A53_DOMAIN          BIT(4)
0061 #define IMX8MM_PCIE_A53_DOMAIN          BIT(3)
0062 #define IMX8MM_MIPI_A53_DOMAIN          BIT(2)
0063 
0064 #define IMX8MN_DISPMIX_A53_DOMAIN       BIT(12)
0065 #define IMX8MN_GPUMIX_A53_DOMAIN        BIT(9)
0066 #define IMX8MN_DDR1_A53_DOMAIN      BIT(7)
0067 #define IMX8MN_OTG1_A53_DOMAIN      BIT(4)
0068 #define IMX8MN_MIPI_A53_DOMAIN      BIT(2)
0069 
0070 #define IMX8MP_MEDIA_ISPDWP_A53_DOMAIN  BIT(20)
0071 #define IMX8MP_HSIOMIX_A53_DOMAIN       BIT(19)
0072 #define IMX8MP_MIPI_PHY2_A53_DOMAIN     BIT(18)
0073 #define IMX8MP_HDMI_PHY_A53_DOMAIN      BIT(17)
0074 #define IMX8MP_HDMIMIX_A53_DOMAIN       BIT(16)
0075 #define IMX8MP_VPU_VC8000E_A53_DOMAIN       BIT(15)
0076 #define IMX8MP_VPU_G2_A53_DOMAIN        BIT(14)
0077 #define IMX8MP_VPU_G1_A53_DOMAIN        BIT(13)
0078 #define IMX8MP_MEDIAMIX_A53_DOMAIN      BIT(12)
0079 #define IMX8MP_GPU3D_A53_DOMAIN         BIT(11)
0080 #define IMX8MP_VPUMIX_A53_DOMAIN        BIT(10)
0081 #define IMX8MP_GPUMIX_A53_DOMAIN        BIT(9)
0082 #define IMX8MP_GPU2D_A53_DOMAIN         BIT(8)
0083 #define IMX8MP_AUDIOMIX_A53_DOMAIN      BIT(7)
0084 #define IMX8MP_MLMIX_A53_DOMAIN         BIT(6)
0085 #define IMX8MP_USB2_PHY_A53_DOMAIN      BIT(5)
0086 #define IMX8MP_USB1_PHY_A53_DOMAIN      BIT(4)
0087 #define IMX8MP_PCIE_PHY_A53_DOMAIN      BIT(3)
0088 #define IMX8MP_MIPI_PHY1_A53_DOMAIN     BIT(2)
0089 
0090 #define IMX8MP_GPC_PU_PGC_SW_PUP_REQ    0x0d8
0091 #define IMX8MP_GPC_PU_PGC_SW_PDN_REQ    0x0e4
0092 
0093 #define GPC_PU_PGC_SW_PUP_REQ       0x0f8
0094 #define GPC_PU_PGC_SW_PDN_REQ       0x104
0095 
0096 #define IMX7_USB_HSIC_PHY_SW_Pxx_REQ        BIT(4)
0097 #define IMX7_USB_OTG2_PHY_SW_Pxx_REQ        BIT(3)
0098 #define IMX7_USB_OTG1_PHY_SW_Pxx_REQ        BIT(2)
0099 #define IMX7_PCIE_PHY_SW_Pxx_REQ        BIT(1)
0100 #define IMX7_MIPI_PHY_SW_Pxx_REQ        BIT(0)
0101 
0102 #define IMX8M_PCIE2_SW_Pxx_REQ          BIT(13)
0103 #define IMX8M_MIPI_CSI2_SW_Pxx_REQ      BIT(12)
0104 #define IMX8M_MIPI_CSI1_SW_Pxx_REQ      BIT(11)
0105 #define IMX8M_DISP_SW_Pxx_REQ           BIT(10)
0106 #define IMX8M_HDMI_SW_Pxx_REQ           BIT(9)
0107 #define IMX8M_VPU_SW_Pxx_REQ            BIT(8)
0108 #define IMX8M_GPU_SW_Pxx_REQ            BIT(7)
0109 #define IMX8M_DDR2_SW_Pxx_REQ           BIT(6)
0110 #define IMX8M_DDR1_SW_Pxx_REQ           BIT(5)
0111 #define IMX8M_OTG2_SW_Pxx_REQ           BIT(3)
0112 #define IMX8M_OTG1_SW_Pxx_REQ           BIT(2)
0113 #define IMX8M_PCIE1_SW_Pxx_REQ          BIT(1)
0114 #define IMX8M_MIPI_SW_Pxx_REQ           BIT(0)
0115 
0116 #define IMX8MM_VPUH1_SW_Pxx_REQ         BIT(13)
0117 #define IMX8MM_VPUG2_SW_Pxx_REQ         BIT(12)
0118 #define IMX8MM_VPUG1_SW_Pxx_REQ         BIT(11)
0119 #define IMX8MM_DISPMIX_SW_Pxx_REQ       BIT(10)
0120 #define IMX8MM_VPUMIX_SW_Pxx_REQ        BIT(8)
0121 #define IMX8MM_GPUMIX_SW_Pxx_REQ        BIT(7)
0122 #define IMX8MM_GPU_SW_Pxx_REQ           (BIT(6) | BIT(9))
0123 #define IMX8MM_DDR1_SW_Pxx_REQ          BIT(5)
0124 #define IMX8MM_OTG2_SW_Pxx_REQ          BIT(3)
0125 #define IMX8MM_OTG1_SW_Pxx_REQ          BIT(2)
0126 #define IMX8MM_PCIE_SW_Pxx_REQ          BIT(1)
0127 #define IMX8MM_MIPI_SW_Pxx_REQ          BIT(0)
0128 
0129 #define IMX8MN_DISPMIX_SW_Pxx_REQ       BIT(10)
0130 #define IMX8MN_GPUMIX_SW_Pxx_REQ        BIT(7)
0131 #define IMX8MN_DDR1_SW_Pxx_REQ      BIT(5)
0132 #define IMX8MN_OTG1_SW_Pxx_REQ      BIT(2)
0133 #define IMX8MN_MIPI_SW_Pxx_REQ      BIT(0)
0134 
0135 #define IMX8MP_DDRMIX_Pxx_REQ           BIT(19)
0136 #define IMX8MP_MEDIA_ISP_DWP_Pxx_REQ        BIT(18)
0137 #define IMX8MP_HSIOMIX_Pxx_REQ          BIT(17)
0138 #define IMX8MP_MIPI_PHY2_Pxx_REQ        BIT(16)
0139 #define IMX8MP_HDMI_PHY_Pxx_REQ         BIT(15)
0140 #define IMX8MP_HDMIMIX_Pxx_REQ          BIT(14)
0141 #define IMX8MP_VPU_VC8K_Pxx_REQ         BIT(13)
0142 #define IMX8MP_VPU_G2_Pxx_REQ           BIT(12)
0143 #define IMX8MP_VPU_G1_Pxx_REQ           BIT(11)
0144 #define IMX8MP_MEDIMIX_Pxx_REQ          BIT(10)
0145 #define IMX8MP_GPU_3D_Pxx_REQ           BIT(9)
0146 #define IMX8MP_VPU_MIX_SHARE_LOGIC_Pxx_REQ  BIT(8)
0147 #define IMX8MP_GPU_SHARE_LOGIC_Pxx_REQ      BIT(7)
0148 #define IMX8MP_GPU_2D_Pxx_REQ           BIT(6)
0149 #define IMX8MP_AUDIOMIX_Pxx_REQ         BIT(5)
0150 #define IMX8MP_MLMIX_Pxx_REQ            BIT(4)
0151 #define IMX8MP_USB2_PHY_Pxx_REQ         BIT(3)
0152 #define IMX8MP_USB1_PHY_Pxx_REQ         BIT(2)
0153 #define IMX8MP_PCIE_PHY_SW_Pxx_REQ      BIT(1)
0154 #define IMX8MP_MIPI_PHY1_SW_Pxx_REQ     BIT(0)
0155 
0156 #define GPC_M4_PU_PDN_FLG       0x1bc
0157 
0158 #define IMX8MP_GPC_PU_PWRHSK        0x190
0159 #define GPC_PU_PWRHSK           0x1fc
0160 
0161 #define IMX8M_GPU_HSK_PWRDNACKN         BIT(26)
0162 #define IMX8M_VPU_HSK_PWRDNACKN         BIT(25)
0163 #define IMX8M_DISP_HSK_PWRDNACKN        BIT(24)
0164 #define IMX8M_GPU_HSK_PWRDNREQN         BIT(6)
0165 #define IMX8M_VPU_HSK_PWRDNREQN         BIT(5)
0166 #define IMX8M_DISP_HSK_PWRDNREQN        BIT(4)
0167 
0168 #define IMX8MM_GPUMIX_HSK_PWRDNACKN     BIT(29)
0169 #define IMX8MM_GPU_HSK_PWRDNACKN        (BIT(27) | BIT(28))
0170 #define IMX8MM_VPUMIX_HSK_PWRDNACKN     BIT(26)
0171 #define IMX8MM_DISPMIX_HSK_PWRDNACKN        BIT(25)
0172 #define IMX8MM_HSIO_HSK_PWRDNACKN       (BIT(23) | BIT(24))
0173 #define IMX8MM_GPUMIX_HSK_PWRDNREQN     BIT(11)
0174 #define IMX8MM_GPU_HSK_PWRDNREQN        (BIT(9) | BIT(10))
0175 #define IMX8MM_VPUMIX_HSK_PWRDNREQN     BIT(8)
0176 #define IMX8MM_DISPMIX_HSK_PWRDNREQN        BIT(7)
0177 #define IMX8MM_HSIO_HSK_PWRDNREQN       (BIT(5) | BIT(6))
0178 
0179 #define IMX8MN_GPUMIX_HSK_PWRDNACKN     (BIT(29) | BIT(27))
0180 #define IMX8MN_DISPMIX_HSK_PWRDNACKN        BIT(25)
0181 #define IMX8MN_HSIO_HSK_PWRDNACKN       BIT(23)
0182 #define IMX8MN_GPUMIX_HSK_PWRDNREQN     (BIT(11) | BIT(9))
0183 #define IMX8MN_DISPMIX_HSK_PWRDNREQN        BIT(7)
0184 #define IMX8MN_HSIO_HSK_PWRDNREQN       BIT(5)
0185 
0186 #define IMX8MP_MEDIAMIX_PWRDNACKN       BIT(30)
0187 #define IMX8MP_HDMIMIX_PWRDNACKN        BIT(29)
0188 #define IMX8MP_HSIOMIX_PWRDNACKN        BIT(28)
0189 #define IMX8MP_VPUMIX_PWRDNACKN         BIT(26)
0190 #define IMX8MP_GPUMIX_PWRDNACKN         BIT(25)
0191 #define IMX8MP_MLMIX_PWRDNACKN          (BIT(23) | BIT(24))
0192 #define IMX8MP_AUDIOMIX_PWRDNACKN       (BIT(20) | BIT(31))
0193 #define IMX8MP_MEDIAMIX_PWRDNREQN       BIT(14)
0194 #define IMX8MP_HDMIMIX_PWRDNREQN        BIT(13)
0195 #define IMX8MP_HSIOMIX_PWRDNREQN        BIT(12)
0196 #define IMX8MP_VPUMIX_PWRDNREQN         BIT(10)
0197 #define IMX8MP_GPUMIX_PWRDNREQN         BIT(9)
0198 #define IMX8MP_MLMIX_PWRDNREQN          (BIT(7) | BIT(8))
0199 #define IMX8MP_AUDIOMIX_PWRDNREQN       (BIT(4) | BIT(15))
0200 
0201 /*
0202  * The PGC offset values in Reference Manual
0203  * (Rev. 1, 01/2018 and the older ones) GPC chapter's
0204  * GPC_PGC memory map are incorrect, below offset
0205  * values are from design RTL.
0206  */
0207 #define IMX7_PGC_MIPI           16
0208 #define IMX7_PGC_PCIE           17
0209 #define IMX7_PGC_USB_HSIC       20
0210 
0211 #define IMX8M_PGC_MIPI          16
0212 #define IMX8M_PGC_PCIE1         17
0213 #define IMX8M_PGC_OTG1          18
0214 #define IMX8M_PGC_OTG2          19
0215 #define IMX8M_PGC_DDR1          21
0216 #define IMX8M_PGC_GPU           23
0217 #define IMX8M_PGC_VPU           24
0218 #define IMX8M_PGC_DISP          26
0219 #define IMX8M_PGC_MIPI_CSI1     27
0220 #define IMX8M_PGC_MIPI_CSI2     28
0221 #define IMX8M_PGC_PCIE2         29
0222 
0223 #define IMX8MM_PGC_MIPI         16
0224 #define IMX8MM_PGC_PCIE         17
0225 #define IMX8MM_PGC_OTG1         18
0226 #define IMX8MM_PGC_OTG2         19
0227 #define IMX8MM_PGC_DDR1         21
0228 #define IMX8MM_PGC_GPU2D        22
0229 #define IMX8MM_PGC_GPUMIX       23
0230 #define IMX8MM_PGC_VPUMIX       24
0231 #define IMX8MM_PGC_GPU3D        25
0232 #define IMX8MM_PGC_DISPMIX      26
0233 #define IMX8MM_PGC_VPUG1        27
0234 #define IMX8MM_PGC_VPUG2        28
0235 #define IMX8MM_PGC_VPUH1        29
0236 
0237 #define IMX8MN_PGC_MIPI     16
0238 #define IMX8MN_PGC_OTG1     18
0239 #define IMX8MN_PGC_DDR1     21
0240 #define IMX8MN_PGC_GPUMIX       23
0241 #define IMX8MN_PGC_DISPMIX      26
0242 
0243 #define IMX8MP_PGC_NOC          9
0244 #define IMX8MP_PGC_MIPI1        12
0245 #define IMX8MP_PGC_PCIE         13
0246 #define IMX8MP_PGC_USB1         14
0247 #define IMX8MP_PGC_USB2         15
0248 #define IMX8MP_PGC_MLMIX        16
0249 #define IMX8MP_PGC_AUDIOMIX     17
0250 #define IMX8MP_PGC_GPU2D        18
0251 #define IMX8MP_PGC_GPUMIX       19
0252 #define IMX8MP_PGC_VPUMIX       20
0253 #define IMX8MP_PGC_GPU3D        21
0254 #define IMX8MP_PGC_MEDIAMIX     22
0255 #define IMX8MP_PGC_VPU_G1       23
0256 #define IMX8MP_PGC_VPU_G2       24
0257 #define IMX8MP_PGC_VPU_VC8000E      25
0258 #define IMX8MP_PGC_HDMIMIX      26
0259 #define IMX8MP_PGC_HDMI         27
0260 #define IMX8MP_PGC_MIPI2        28
0261 #define IMX8MP_PGC_HSIOMIX      29
0262 #define IMX8MP_PGC_MEDIA_ISP_DWP    30
0263 #define IMX8MP_PGC_DDRMIX       31
0264 
0265 #define GPC_PGC_CTRL(n)         (0x800 + (n) * 0x40)
0266 #define GPC_PGC_SR(n)           (GPC_PGC_CTRL(n) + 0xc)
0267 
0268 #define GPC_PGC_CTRL_PCR        BIT(0)
0269 
0270 struct imx_pgc_regs {
0271     u16 map;
0272     u16 pup;
0273     u16 pdn;
0274     u16 hsk;
0275 };
0276 
0277 struct imx_pgc_domain {
0278     struct generic_pm_domain genpd;
0279     struct regmap *regmap;
0280     const struct imx_pgc_regs *regs;
0281     struct regulator *regulator;
0282     struct reset_control *reset;
0283     struct clk_bulk_data *clks;
0284     int num_clks;
0285 
0286     unsigned long pgc;
0287 
0288     const struct {
0289         u32 pxx;
0290         u32 map;
0291         u32 hskreq;
0292         u32 hskack;
0293     } bits;
0294 
0295     const int voltage;
0296     const bool keep_clocks;
0297     struct device *dev;
0298 
0299     unsigned int pgc_sw_pup_reg;
0300     unsigned int pgc_sw_pdn_reg;
0301 };
0302 
0303 struct imx_pgc_domain_data {
0304     const struct imx_pgc_domain *domains;
0305     size_t domains_num;
0306     const struct regmap_access_table *reg_access_table;
0307     const struct imx_pgc_regs *pgc_regs;
0308 };
0309 
0310 static inline struct imx_pgc_domain *
0311 to_imx_pgc_domain(struct generic_pm_domain *genpd)
0312 {
0313     return container_of(genpd, struct imx_pgc_domain, genpd);
0314 }
0315 
0316 static int imx_pgc_power_up(struct generic_pm_domain *genpd)
0317 {
0318     struct imx_pgc_domain *domain = to_imx_pgc_domain(genpd);
0319     u32 reg_val, pgc;
0320     int ret;
0321 
0322     ret = pm_runtime_get_sync(domain->dev);
0323     if (ret < 0) {
0324         pm_runtime_put_noidle(domain->dev);
0325         return ret;
0326     }
0327 
0328     if (!IS_ERR(domain->regulator)) {
0329         ret = regulator_enable(domain->regulator);
0330         if (ret) {
0331             dev_err(domain->dev,
0332                 "failed to enable regulator: %pe\n",
0333                 ERR_PTR(ret));
0334             goto out_put_pm;
0335         }
0336     }
0337 
0338     reset_control_assert(domain->reset);
0339 
0340     /* Enable reset clocks for all devices in the domain */
0341     ret = clk_bulk_prepare_enable(domain->num_clks, domain->clks);
0342     if (ret) {
0343         dev_err(domain->dev, "failed to enable reset clocks\n");
0344         goto out_regulator_disable;
0345     }
0346 
0347     /* delays for reset to propagate */
0348     udelay(5);
0349 
0350     if (domain->bits.pxx) {
0351         /* request the domain to power up */
0352         regmap_update_bits(domain->regmap, domain->regs->pup,
0353                    domain->bits.pxx, domain->bits.pxx);
0354         /*
0355          * As per "5.5.9.4 Example Code 4" in IMX7DRM.pdf wait
0356          * for PUP_REQ/PDN_REQ bit to be cleared
0357          */
0358         ret = regmap_read_poll_timeout(domain->regmap,
0359                            domain->regs->pup, reg_val,
0360                            !(reg_val & domain->bits.pxx),
0361                            0, USEC_PER_MSEC);
0362         if (ret) {
0363             dev_err(domain->dev, "failed to command PGC\n");
0364             goto out_clk_disable;
0365         }
0366 
0367         /* disable power control */
0368         for_each_set_bit(pgc, &domain->pgc, 32) {
0369             regmap_clear_bits(domain->regmap, GPC_PGC_CTRL(pgc),
0370                       GPC_PGC_CTRL_PCR);
0371         }
0372     }
0373 
0374     /* delay for reset to propagate */
0375     udelay(5);
0376 
0377     reset_control_deassert(domain->reset);
0378 
0379     /* request the ADB400 to power up */
0380     if (domain->bits.hskreq) {
0381         regmap_update_bits(domain->regmap, domain->regs->hsk,
0382                    domain->bits.hskreq, domain->bits.hskreq);
0383 
0384         /*
0385          * ret = regmap_read_poll_timeout(domain->regmap, domain->regs->hsk, reg_val,
0386          *                (reg_val & domain->bits.hskack), 0,
0387          *                USEC_PER_MSEC);
0388          * Technically we need the commented code to wait handshake. But that needs
0389          * the BLK-CTL module BUS clk-en bit being set.
0390          *
0391          * There is a separate BLK-CTL module and we will have such a driver for it,
0392          * that driver will set the BUS clk-en bit and handshake will be triggered
0393          * automatically there. Just add a delay and suppose the handshake finish
0394          * after that.
0395          */
0396     }
0397 
0398     /* Disable reset clocks for all devices in the domain */
0399     if (!domain->keep_clocks)
0400         clk_bulk_disable_unprepare(domain->num_clks, domain->clks);
0401 
0402     return 0;
0403 
0404 out_clk_disable:
0405     clk_bulk_disable_unprepare(domain->num_clks, domain->clks);
0406 out_regulator_disable:
0407     if (!IS_ERR(domain->regulator))
0408         regulator_disable(domain->regulator);
0409 out_put_pm:
0410     pm_runtime_put(domain->dev);
0411 
0412     return ret;
0413 }
0414 
0415 static int imx_pgc_power_down(struct generic_pm_domain *genpd)
0416 {
0417     struct imx_pgc_domain *domain = to_imx_pgc_domain(genpd);
0418     u32 reg_val, pgc;
0419     int ret;
0420 
0421     /* Enable reset clocks for all devices in the domain */
0422     if (!domain->keep_clocks) {
0423         ret = clk_bulk_prepare_enable(domain->num_clks, domain->clks);
0424         if (ret) {
0425             dev_err(domain->dev, "failed to enable reset clocks\n");
0426             return ret;
0427         }
0428     }
0429 
0430     /* request the ADB400 to power down */
0431     if (domain->bits.hskreq) {
0432         regmap_clear_bits(domain->regmap, domain->regs->hsk,
0433                   domain->bits.hskreq);
0434 
0435         ret = regmap_read_poll_timeout(domain->regmap, domain->regs->hsk,
0436                            reg_val,
0437                            !(reg_val & domain->bits.hskack),
0438                            0, USEC_PER_MSEC);
0439         if (ret) {
0440             dev_err(domain->dev, "failed to power down ADB400\n");
0441             goto out_clk_disable;
0442         }
0443     }
0444 
0445     if (domain->bits.pxx) {
0446         /* enable power control */
0447         for_each_set_bit(pgc, &domain->pgc, 32) {
0448             regmap_update_bits(domain->regmap, GPC_PGC_CTRL(pgc),
0449                        GPC_PGC_CTRL_PCR, GPC_PGC_CTRL_PCR);
0450         }
0451 
0452         /* request the domain to power down */
0453         regmap_update_bits(domain->regmap, domain->regs->pdn,
0454                    domain->bits.pxx, domain->bits.pxx);
0455         /*
0456          * As per "5.5.9.4 Example Code 4" in IMX7DRM.pdf wait
0457          * for PUP_REQ/PDN_REQ bit to be cleared
0458          */
0459         ret = regmap_read_poll_timeout(domain->regmap,
0460                            domain->regs->pdn, reg_val,
0461                            !(reg_val & domain->bits.pxx),
0462                            0, USEC_PER_MSEC);
0463         if (ret) {
0464             dev_err(domain->dev, "failed to command PGC\n");
0465             goto out_clk_disable;
0466         }
0467     }
0468 
0469     /* Disable reset clocks for all devices in the domain */
0470     clk_bulk_disable_unprepare(domain->num_clks, domain->clks);
0471 
0472     if (!IS_ERR(domain->regulator)) {
0473         ret = regulator_disable(domain->regulator);
0474         if (ret) {
0475             dev_err(domain->dev,
0476                 "failed to disable regulator: %pe\n",
0477                 ERR_PTR(ret));
0478             return ret;
0479         }
0480     }
0481 
0482     pm_runtime_put_sync_suspend(domain->dev);
0483 
0484     return 0;
0485 
0486 out_clk_disable:
0487     if (!domain->keep_clocks)
0488         clk_bulk_disable_unprepare(domain->num_clks, domain->clks);
0489 
0490     return ret;
0491 }
0492 
0493 static const struct imx_pgc_domain imx7_pgc_domains[] = {
0494     [IMX7_POWER_DOMAIN_MIPI_PHY] = {
0495         .genpd = {
0496             .name      = "mipi-phy",
0497         },
0498         .bits  = {
0499             .pxx = IMX7_MIPI_PHY_SW_Pxx_REQ,
0500             .map = IMX7_MIPI_PHY_A_CORE_DOMAIN,
0501         },
0502         .voltage   = 1000000,
0503         .pgc       = BIT(IMX7_PGC_MIPI),
0504     },
0505 
0506     [IMX7_POWER_DOMAIN_PCIE_PHY] = {
0507         .genpd = {
0508             .name      = "pcie-phy",
0509         },
0510         .bits  = {
0511             .pxx = IMX7_PCIE_PHY_SW_Pxx_REQ,
0512             .map = IMX7_PCIE_PHY_A_CORE_DOMAIN,
0513         },
0514         .voltage   = 1000000,
0515         .pgc       = BIT(IMX7_PGC_PCIE),
0516     },
0517 
0518     [IMX7_POWER_DOMAIN_USB_HSIC_PHY] = {
0519         .genpd = {
0520             .name      = "usb-hsic-phy",
0521         },
0522         .bits  = {
0523             .pxx = IMX7_USB_HSIC_PHY_SW_Pxx_REQ,
0524             .map = IMX7_USB_HSIC_PHY_A_CORE_DOMAIN,
0525         },
0526         .voltage   = 1200000,
0527         .pgc       = BIT(IMX7_PGC_USB_HSIC),
0528     },
0529 };
0530 
0531 static const struct regmap_range imx7_yes_ranges[] = {
0532         regmap_reg_range(GPC_LPCR_A_CORE_BSC,
0533                  GPC_M4_PU_PDN_FLG),
0534         regmap_reg_range(GPC_PGC_CTRL(IMX7_PGC_MIPI),
0535                  GPC_PGC_SR(IMX7_PGC_MIPI)),
0536         regmap_reg_range(GPC_PGC_CTRL(IMX7_PGC_PCIE),
0537                  GPC_PGC_SR(IMX7_PGC_PCIE)),
0538         regmap_reg_range(GPC_PGC_CTRL(IMX7_PGC_USB_HSIC),
0539                  GPC_PGC_SR(IMX7_PGC_USB_HSIC)),
0540 };
0541 
0542 static const struct regmap_access_table imx7_access_table = {
0543     .yes_ranges = imx7_yes_ranges,
0544     .n_yes_ranges   = ARRAY_SIZE(imx7_yes_ranges),
0545 };
0546 
0547 static const struct imx_pgc_regs imx7_pgc_regs = {
0548     .map = GPC_PGC_CPU_MAPPING,
0549     .pup = GPC_PU_PGC_SW_PUP_REQ,
0550     .pdn = GPC_PU_PGC_SW_PDN_REQ,
0551     .hsk = GPC_PU_PWRHSK,
0552 };
0553 
0554 static const struct imx_pgc_domain_data imx7_pgc_domain_data = {
0555     .domains = imx7_pgc_domains,
0556     .domains_num = ARRAY_SIZE(imx7_pgc_domains),
0557     .reg_access_table = &imx7_access_table,
0558     .pgc_regs = &imx7_pgc_regs,
0559 };
0560 
0561 static const struct imx_pgc_domain imx8m_pgc_domains[] = {
0562     [IMX8M_POWER_DOMAIN_MIPI] = {
0563         .genpd = {
0564             .name      = "mipi",
0565         },
0566         .bits  = {
0567             .pxx = IMX8M_MIPI_SW_Pxx_REQ,
0568             .map = IMX8M_MIPI_A53_DOMAIN,
0569         },
0570         .pgc       = BIT(IMX8M_PGC_MIPI),
0571     },
0572 
0573     [IMX8M_POWER_DOMAIN_PCIE1] = {
0574         .genpd = {
0575             .name = "pcie1",
0576         },
0577         .bits  = {
0578             .pxx = IMX8M_PCIE1_SW_Pxx_REQ,
0579             .map = IMX8M_PCIE1_A53_DOMAIN,
0580         },
0581         .pgc   = BIT(IMX8M_PGC_PCIE1),
0582     },
0583 
0584     [IMX8M_POWER_DOMAIN_USB_OTG1] = {
0585         .genpd = {
0586             .name = "usb-otg1",
0587         },
0588         .bits  = {
0589             .pxx = IMX8M_OTG1_SW_Pxx_REQ,
0590             .map = IMX8M_OTG1_A53_DOMAIN,
0591         },
0592         .pgc   = BIT(IMX8M_PGC_OTG1),
0593     },
0594 
0595     [IMX8M_POWER_DOMAIN_USB_OTG2] = {
0596         .genpd = {
0597             .name = "usb-otg2",
0598         },
0599         .bits  = {
0600             .pxx = IMX8M_OTG2_SW_Pxx_REQ,
0601             .map = IMX8M_OTG2_A53_DOMAIN,
0602         },
0603         .pgc   = BIT(IMX8M_PGC_OTG2),
0604     },
0605 
0606     [IMX8M_POWER_DOMAIN_DDR1] = {
0607         .genpd = {
0608             .name = "ddr1",
0609         },
0610         .bits  = {
0611             .pxx = IMX8M_DDR1_SW_Pxx_REQ,
0612             .map = IMX8M_DDR2_A53_DOMAIN,
0613         },
0614         .pgc   = BIT(IMX8M_PGC_DDR1),
0615     },
0616 
0617     [IMX8M_POWER_DOMAIN_GPU] = {
0618         .genpd = {
0619             .name = "gpu",
0620         },
0621         .bits  = {
0622             .pxx = IMX8M_GPU_SW_Pxx_REQ,
0623             .map = IMX8M_GPU_A53_DOMAIN,
0624             .hskreq = IMX8M_GPU_HSK_PWRDNREQN,
0625             .hskack = IMX8M_GPU_HSK_PWRDNACKN,
0626         },
0627         .pgc   = BIT(IMX8M_PGC_GPU),
0628     },
0629 
0630     [IMX8M_POWER_DOMAIN_VPU] = {
0631         .genpd = {
0632             .name = "vpu",
0633         },
0634         .bits  = {
0635             .pxx = IMX8M_VPU_SW_Pxx_REQ,
0636             .map = IMX8M_VPU_A53_DOMAIN,
0637             .hskreq = IMX8M_VPU_HSK_PWRDNREQN,
0638             .hskack = IMX8M_VPU_HSK_PWRDNACKN,
0639         },
0640         .pgc   = BIT(IMX8M_PGC_VPU),
0641         .keep_clocks = true,
0642     },
0643 
0644     [IMX8M_POWER_DOMAIN_DISP] = {
0645         .genpd = {
0646             .name = "disp",
0647         },
0648         .bits  = {
0649             .pxx = IMX8M_DISP_SW_Pxx_REQ,
0650             .map = IMX8M_DISP_A53_DOMAIN,
0651             .hskreq = IMX8M_DISP_HSK_PWRDNREQN,
0652             .hskack = IMX8M_DISP_HSK_PWRDNACKN,
0653         },
0654         .pgc   = BIT(IMX8M_PGC_DISP),
0655     },
0656 
0657     [IMX8M_POWER_DOMAIN_MIPI_CSI1] = {
0658         .genpd = {
0659             .name = "mipi-csi1",
0660         },
0661         .bits  = {
0662             .pxx = IMX8M_MIPI_CSI1_SW_Pxx_REQ,
0663             .map = IMX8M_MIPI_CSI1_A53_DOMAIN,
0664         },
0665         .pgc   = BIT(IMX8M_PGC_MIPI_CSI1),
0666     },
0667 
0668     [IMX8M_POWER_DOMAIN_MIPI_CSI2] = {
0669         .genpd = {
0670             .name = "mipi-csi2",
0671         },
0672         .bits  = {
0673             .pxx = IMX8M_MIPI_CSI2_SW_Pxx_REQ,
0674             .map = IMX8M_MIPI_CSI2_A53_DOMAIN,
0675         },
0676         .pgc   = BIT(IMX8M_PGC_MIPI_CSI2),
0677     },
0678 
0679     [IMX8M_POWER_DOMAIN_PCIE2] = {
0680         .genpd = {
0681             .name = "pcie2",
0682         },
0683         .bits  = {
0684             .pxx = IMX8M_PCIE2_SW_Pxx_REQ,
0685             .map = IMX8M_PCIE2_A53_DOMAIN,
0686         },
0687         .pgc   = BIT(IMX8M_PGC_PCIE2),
0688     },
0689 };
0690 
0691 static const struct regmap_range imx8m_yes_ranges[] = {
0692         regmap_reg_range(GPC_LPCR_A_CORE_BSC,
0693                  GPC_PU_PWRHSK),
0694         regmap_reg_range(GPC_PGC_CTRL(IMX8M_PGC_MIPI),
0695                  GPC_PGC_SR(IMX8M_PGC_MIPI)),
0696         regmap_reg_range(GPC_PGC_CTRL(IMX8M_PGC_PCIE1),
0697                  GPC_PGC_SR(IMX8M_PGC_PCIE1)),
0698         regmap_reg_range(GPC_PGC_CTRL(IMX8M_PGC_OTG1),
0699                  GPC_PGC_SR(IMX8M_PGC_OTG1)),
0700         regmap_reg_range(GPC_PGC_CTRL(IMX8M_PGC_OTG2),
0701                  GPC_PGC_SR(IMX8M_PGC_OTG2)),
0702         regmap_reg_range(GPC_PGC_CTRL(IMX8M_PGC_DDR1),
0703                  GPC_PGC_SR(IMX8M_PGC_DDR1)),
0704         regmap_reg_range(GPC_PGC_CTRL(IMX8M_PGC_GPU),
0705                  GPC_PGC_SR(IMX8M_PGC_GPU)),
0706         regmap_reg_range(GPC_PGC_CTRL(IMX8M_PGC_VPU),
0707                  GPC_PGC_SR(IMX8M_PGC_VPU)),
0708         regmap_reg_range(GPC_PGC_CTRL(IMX8M_PGC_DISP),
0709                  GPC_PGC_SR(IMX8M_PGC_DISP)),
0710         regmap_reg_range(GPC_PGC_CTRL(IMX8M_PGC_MIPI_CSI1),
0711                  GPC_PGC_SR(IMX8M_PGC_MIPI_CSI1)),
0712         regmap_reg_range(GPC_PGC_CTRL(IMX8M_PGC_MIPI_CSI2),
0713                  GPC_PGC_SR(IMX8M_PGC_MIPI_CSI2)),
0714         regmap_reg_range(GPC_PGC_CTRL(IMX8M_PGC_PCIE2),
0715                  GPC_PGC_SR(IMX8M_PGC_PCIE2)),
0716 };
0717 
0718 static const struct regmap_access_table imx8m_access_table = {
0719     .yes_ranges = imx8m_yes_ranges,
0720     .n_yes_ranges   = ARRAY_SIZE(imx8m_yes_ranges),
0721 };
0722 
0723 static const struct imx_pgc_domain_data imx8m_pgc_domain_data = {
0724     .domains = imx8m_pgc_domains,
0725     .domains_num = ARRAY_SIZE(imx8m_pgc_domains),
0726     .reg_access_table = &imx8m_access_table,
0727     .pgc_regs = &imx7_pgc_regs,
0728 };
0729 
0730 static const struct imx_pgc_domain imx8mm_pgc_domains[] = {
0731     [IMX8MM_POWER_DOMAIN_HSIOMIX] = {
0732         .genpd = {
0733             .name = "hsiomix",
0734         },
0735         .bits  = {
0736             .pxx = 0, /* no power sequence control */
0737             .map = 0, /* no power sequence control */
0738             .hskreq = IMX8MM_HSIO_HSK_PWRDNREQN,
0739             .hskack = IMX8MM_HSIO_HSK_PWRDNACKN,
0740         },
0741         .keep_clocks = true,
0742     },
0743 
0744     [IMX8MM_POWER_DOMAIN_PCIE] = {
0745         .genpd = {
0746             .name = "pcie",
0747         },
0748         .bits  = {
0749             .pxx = IMX8MM_PCIE_SW_Pxx_REQ,
0750             .map = IMX8MM_PCIE_A53_DOMAIN,
0751         },
0752         .pgc   = BIT(IMX8MM_PGC_PCIE),
0753     },
0754 
0755     [IMX8MM_POWER_DOMAIN_OTG1] = {
0756         .genpd = {
0757             .name = "usb-otg1",
0758         },
0759         .bits  = {
0760             .pxx = IMX8MM_OTG1_SW_Pxx_REQ,
0761             .map = IMX8MM_OTG1_A53_DOMAIN,
0762         },
0763         .pgc   = BIT(IMX8MM_PGC_OTG1),
0764     },
0765 
0766     [IMX8MM_POWER_DOMAIN_OTG2] = {
0767         .genpd = {
0768             .name = "usb-otg2",
0769         },
0770         .bits  = {
0771             .pxx = IMX8MM_OTG2_SW_Pxx_REQ,
0772             .map = IMX8MM_OTG2_A53_DOMAIN,
0773         },
0774         .pgc   = BIT(IMX8MM_PGC_OTG2),
0775     },
0776 
0777     [IMX8MM_POWER_DOMAIN_GPUMIX] = {
0778         .genpd = {
0779             .name = "gpumix",
0780         },
0781         .bits  = {
0782             .pxx = IMX8MM_GPUMIX_SW_Pxx_REQ,
0783             .map = IMX8MM_GPUMIX_A53_DOMAIN,
0784             .hskreq = IMX8MM_GPUMIX_HSK_PWRDNREQN,
0785             .hskack = IMX8MM_GPUMIX_HSK_PWRDNACKN,
0786         },
0787         .pgc   = BIT(IMX8MM_PGC_GPUMIX),
0788         .keep_clocks = true,
0789     },
0790 
0791     [IMX8MM_POWER_DOMAIN_GPU] = {
0792         .genpd = {
0793             .name = "gpu",
0794         },
0795         .bits  = {
0796             .pxx = IMX8MM_GPU_SW_Pxx_REQ,
0797             .map = IMX8MM_GPU_A53_DOMAIN,
0798             .hskreq = IMX8MM_GPU_HSK_PWRDNREQN,
0799             .hskack = IMX8MM_GPU_HSK_PWRDNACKN,
0800         },
0801         .pgc   = BIT(IMX8MM_PGC_GPU2D) | BIT(IMX8MM_PGC_GPU3D),
0802     },
0803 
0804     [IMX8MM_POWER_DOMAIN_VPUMIX] = {
0805         .genpd = {
0806             .name = "vpumix",
0807         },
0808         .bits  = {
0809             .pxx = IMX8MM_VPUMIX_SW_Pxx_REQ,
0810             .map = IMX8MM_VPUMIX_A53_DOMAIN,
0811             .hskreq = IMX8MM_VPUMIX_HSK_PWRDNREQN,
0812             .hskack = IMX8MM_VPUMIX_HSK_PWRDNACKN,
0813         },
0814         .pgc   = BIT(IMX8MM_PGC_VPUMIX),
0815         .keep_clocks = true,
0816     },
0817 
0818     [IMX8MM_POWER_DOMAIN_VPUG1] = {
0819         .genpd = {
0820             .name = "vpu-g1",
0821         },
0822         .bits  = {
0823             .pxx = IMX8MM_VPUG1_SW_Pxx_REQ,
0824             .map = IMX8MM_VPUG1_A53_DOMAIN,
0825         },
0826         .pgc   = BIT(IMX8MM_PGC_VPUG1),
0827     },
0828 
0829     [IMX8MM_POWER_DOMAIN_VPUG2] = {
0830         .genpd = {
0831             .name = "vpu-g2",
0832         },
0833         .bits  = {
0834             .pxx = IMX8MM_VPUG2_SW_Pxx_REQ,
0835             .map = IMX8MM_VPUG2_A53_DOMAIN,
0836         },
0837         .pgc   = BIT(IMX8MM_PGC_VPUG2),
0838     },
0839 
0840     [IMX8MM_POWER_DOMAIN_VPUH1] = {
0841         .genpd = {
0842             .name = "vpu-h1",
0843         },
0844         .bits  = {
0845             .pxx = IMX8MM_VPUH1_SW_Pxx_REQ,
0846             .map = IMX8MM_VPUH1_A53_DOMAIN,
0847         },
0848         .pgc   = BIT(IMX8MM_PGC_VPUH1),
0849         .keep_clocks = true,
0850     },
0851 
0852     [IMX8MM_POWER_DOMAIN_DISPMIX] = {
0853         .genpd = {
0854             .name = "dispmix",
0855         },
0856         .bits  = {
0857             .pxx = IMX8MM_DISPMIX_SW_Pxx_REQ,
0858             .map = IMX8MM_DISPMIX_A53_DOMAIN,
0859             .hskreq = IMX8MM_DISPMIX_HSK_PWRDNREQN,
0860             .hskack = IMX8MM_DISPMIX_HSK_PWRDNACKN,
0861         },
0862         .pgc   = BIT(IMX8MM_PGC_DISPMIX),
0863         .keep_clocks = true,
0864     },
0865 
0866     [IMX8MM_POWER_DOMAIN_MIPI] = {
0867         .genpd = {
0868             .name = "mipi",
0869         },
0870         .bits  = {
0871             .pxx = IMX8MM_MIPI_SW_Pxx_REQ,
0872             .map = IMX8MM_MIPI_A53_DOMAIN,
0873         },
0874         .pgc   = BIT(IMX8MM_PGC_MIPI),
0875     },
0876 };
0877 
0878 static const struct regmap_range imx8mm_yes_ranges[] = {
0879         regmap_reg_range(GPC_LPCR_A_CORE_BSC,
0880                  GPC_PU_PWRHSK),
0881         regmap_reg_range(GPC_PGC_CTRL(IMX8MM_PGC_MIPI),
0882                  GPC_PGC_SR(IMX8MM_PGC_MIPI)),
0883         regmap_reg_range(GPC_PGC_CTRL(IMX8MM_PGC_PCIE),
0884                  GPC_PGC_SR(IMX8MM_PGC_PCIE)),
0885         regmap_reg_range(GPC_PGC_CTRL(IMX8MM_PGC_OTG1),
0886                  GPC_PGC_SR(IMX8MM_PGC_OTG1)),
0887         regmap_reg_range(GPC_PGC_CTRL(IMX8MM_PGC_OTG2),
0888                  GPC_PGC_SR(IMX8MM_PGC_OTG2)),
0889         regmap_reg_range(GPC_PGC_CTRL(IMX8MM_PGC_DDR1),
0890                  GPC_PGC_SR(IMX8MM_PGC_DDR1)),
0891         regmap_reg_range(GPC_PGC_CTRL(IMX8MM_PGC_GPU2D),
0892                  GPC_PGC_SR(IMX8MM_PGC_GPU2D)),
0893         regmap_reg_range(GPC_PGC_CTRL(IMX8MM_PGC_GPUMIX),
0894                  GPC_PGC_SR(IMX8MM_PGC_GPUMIX)),
0895         regmap_reg_range(GPC_PGC_CTRL(IMX8MM_PGC_VPUMIX),
0896                  GPC_PGC_SR(IMX8MM_PGC_VPUMIX)),
0897         regmap_reg_range(GPC_PGC_CTRL(IMX8MM_PGC_GPU3D),
0898                  GPC_PGC_SR(IMX8MM_PGC_GPU3D)),
0899         regmap_reg_range(GPC_PGC_CTRL(IMX8MM_PGC_DISPMIX),
0900                  GPC_PGC_SR(IMX8MM_PGC_DISPMIX)),
0901         regmap_reg_range(GPC_PGC_CTRL(IMX8MM_PGC_VPUG1),
0902                  GPC_PGC_SR(IMX8MM_PGC_VPUG1)),
0903         regmap_reg_range(GPC_PGC_CTRL(IMX8MM_PGC_VPUG2),
0904                  GPC_PGC_SR(IMX8MM_PGC_VPUG2)),
0905         regmap_reg_range(GPC_PGC_CTRL(IMX8MM_PGC_VPUH1),
0906                  GPC_PGC_SR(IMX8MM_PGC_VPUH1)),
0907 };
0908 
0909 static const struct regmap_access_table imx8mm_access_table = {
0910     .yes_ranges = imx8mm_yes_ranges,
0911     .n_yes_ranges   = ARRAY_SIZE(imx8mm_yes_ranges),
0912 };
0913 
0914 static const struct imx_pgc_domain_data imx8mm_pgc_domain_data = {
0915     .domains = imx8mm_pgc_domains,
0916     .domains_num = ARRAY_SIZE(imx8mm_pgc_domains),
0917     .reg_access_table = &imx8mm_access_table,
0918     .pgc_regs = &imx7_pgc_regs,
0919 };
0920 
0921 static const struct imx_pgc_domain imx8mp_pgc_domains[] = {
0922     [IMX8MP_POWER_DOMAIN_MIPI_PHY1] = {
0923         .genpd = {
0924             .name = "mipi-phy1",
0925         },
0926         .bits = {
0927             .pxx = IMX8MP_MIPI_PHY1_SW_Pxx_REQ,
0928             .map = IMX8MP_MIPI_PHY1_A53_DOMAIN,
0929         },
0930         .pgc = BIT(IMX8MP_PGC_MIPI1),
0931     },
0932 
0933     [IMX8MP_POWER_DOMAIN_PCIE_PHY] = {
0934         .genpd = {
0935             .name = "pcie-phy1",
0936         },
0937         .bits = {
0938             .pxx = IMX8MP_PCIE_PHY_SW_Pxx_REQ,
0939             .map = IMX8MP_PCIE_PHY_A53_DOMAIN,
0940         },
0941         .pgc = BIT(IMX8MP_PGC_PCIE),
0942     },
0943 
0944     [IMX8MP_POWER_DOMAIN_USB1_PHY] = {
0945         .genpd = {
0946             .name = "usb-otg1",
0947         },
0948         .bits = {
0949             .pxx = IMX8MP_USB1_PHY_Pxx_REQ,
0950             .map = IMX8MP_USB1_PHY_A53_DOMAIN,
0951         },
0952         .pgc = BIT(IMX8MP_PGC_USB1),
0953     },
0954 
0955     [IMX8MP_POWER_DOMAIN_USB2_PHY] = {
0956         .genpd = {
0957             .name = "usb-otg2",
0958         },
0959         .bits = {
0960             .pxx = IMX8MP_USB2_PHY_Pxx_REQ,
0961             .map = IMX8MP_USB2_PHY_A53_DOMAIN,
0962         },
0963         .pgc = BIT(IMX8MP_PGC_USB2),
0964     },
0965 
0966     [IMX8MP_POWER_DOMAIN_MLMIX] = {
0967         .genpd = {
0968             .name = "mlmix",
0969         },
0970         .bits = {
0971             .pxx = IMX8MP_MLMIX_Pxx_REQ,
0972             .map = IMX8MP_MLMIX_A53_DOMAIN,
0973             .hskreq = IMX8MP_MLMIX_PWRDNREQN,
0974             .hskack = IMX8MP_MLMIX_PWRDNACKN,
0975         },
0976         .pgc = BIT(IMX8MP_PGC_MLMIX),
0977         .keep_clocks = true,
0978     },
0979 
0980     [IMX8MP_POWER_DOMAIN_AUDIOMIX] = {
0981         .genpd = {
0982             .name = "audiomix",
0983         },
0984         .bits = {
0985             .pxx = IMX8MP_AUDIOMIX_Pxx_REQ,
0986             .map = IMX8MP_AUDIOMIX_A53_DOMAIN,
0987             .hskreq = IMX8MP_AUDIOMIX_PWRDNREQN,
0988             .hskack = IMX8MP_AUDIOMIX_PWRDNACKN,
0989         },
0990         .pgc = BIT(IMX8MP_PGC_AUDIOMIX),
0991         .keep_clocks = true,
0992     },
0993 
0994     [IMX8MP_POWER_DOMAIN_GPU2D] = {
0995         .genpd = {
0996             .name = "gpu2d",
0997         },
0998         .bits = {
0999             .pxx = IMX8MP_GPU_2D_Pxx_REQ,
1000             .map = IMX8MP_GPU2D_A53_DOMAIN,
1001         },
1002         .pgc = BIT(IMX8MP_PGC_GPU2D),
1003     },
1004 
1005     [IMX8MP_POWER_DOMAIN_GPUMIX] = {
1006         .genpd = {
1007             .name = "gpumix",
1008         },
1009         .bits = {
1010             .pxx = IMX8MP_GPU_SHARE_LOGIC_Pxx_REQ,
1011             .map = IMX8MP_GPUMIX_A53_DOMAIN,
1012             .hskreq = IMX8MP_GPUMIX_PWRDNREQN,
1013             .hskack = IMX8MP_GPUMIX_PWRDNACKN,
1014         },
1015         .pgc = BIT(IMX8MP_PGC_GPUMIX),
1016         .keep_clocks = true,
1017     },
1018 
1019     [IMX8MP_POWER_DOMAIN_VPUMIX] = {
1020         .genpd = {
1021             .name = "vpumix",
1022         },
1023         .bits = {
1024             .pxx = IMX8MP_VPU_MIX_SHARE_LOGIC_Pxx_REQ,
1025             .map = IMX8MP_VPUMIX_A53_DOMAIN,
1026             .hskreq = IMX8MP_VPUMIX_PWRDNREQN,
1027             .hskack = IMX8MP_VPUMIX_PWRDNACKN,
1028         },
1029         .pgc = BIT(IMX8MP_PGC_VPUMIX),
1030         .keep_clocks = true,
1031     },
1032 
1033     [IMX8MP_POWER_DOMAIN_GPU3D] = {
1034         .genpd = {
1035             .name = "gpu3d",
1036         },
1037         .bits = {
1038             .pxx = IMX8MP_GPU_3D_Pxx_REQ,
1039             .map = IMX8MP_GPU3D_A53_DOMAIN,
1040         },
1041         .pgc = BIT(IMX8MP_PGC_GPU3D),
1042     },
1043 
1044     [IMX8MP_POWER_DOMAIN_MEDIAMIX] = {
1045         .genpd = {
1046             .name = "mediamix",
1047         },
1048         .bits = {
1049             .pxx = IMX8MP_MEDIMIX_Pxx_REQ,
1050             .map = IMX8MP_MEDIAMIX_A53_DOMAIN,
1051             .hskreq = IMX8MP_MEDIAMIX_PWRDNREQN,
1052             .hskack = IMX8MP_MEDIAMIX_PWRDNACKN,
1053         },
1054         .pgc = BIT(IMX8MP_PGC_MEDIAMIX),
1055         .keep_clocks = true,
1056     },
1057 
1058     [IMX8MP_POWER_DOMAIN_VPU_G1] = {
1059         .genpd = {
1060             .name = "vpu-g1",
1061         },
1062         .bits = {
1063             .pxx = IMX8MP_VPU_G1_Pxx_REQ,
1064             .map = IMX8MP_VPU_G1_A53_DOMAIN,
1065         },
1066         .pgc = BIT(IMX8MP_PGC_VPU_G1),
1067     },
1068 
1069     [IMX8MP_POWER_DOMAIN_VPU_G2] = {
1070         .genpd = {
1071             .name = "vpu-g2",
1072         },
1073         .bits = {
1074             .pxx = IMX8MP_VPU_G2_Pxx_REQ,
1075             .map = IMX8MP_VPU_G2_A53_DOMAIN
1076         },
1077         .pgc = BIT(IMX8MP_PGC_VPU_G2),
1078     },
1079 
1080     [IMX8MP_POWER_DOMAIN_VPU_VC8000E] = {
1081         .genpd = {
1082             .name = "vpu-h1",
1083         },
1084         .bits = {
1085             .pxx = IMX8MP_VPU_VC8K_Pxx_REQ,
1086             .map = IMX8MP_VPU_VC8000E_A53_DOMAIN,
1087         },
1088         .pgc = BIT(IMX8MP_PGC_VPU_VC8000E),
1089     },
1090 
1091     [IMX8MP_POWER_DOMAIN_HDMIMIX] = {
1092         .genpd = {
1093             .name = "hdmimix",
1094         },
1095         .bits = {
1096             .pxx = IMX8MP_HDMIMIX_Pxx_REQ,
1097             .map = IMX8MP_HDMIMIX_A53_DOMAIN,
1098             .hskreq = IMX8MP_HDMIMIX_PWRDNREQN,
1099             .hskack = IMX8MP_HDMIMIX_PWRDNACKN,
1100         },
1101         .pgc = BIT(IMX8MP_PGC_HDMIMIX),
1102         .keep_clocks = true,
1103     },
1104 
1105     [IMX8MP_POWER_DOMAIN_HDMI_PHY] = {
1106         .genpd = {
1107             .name = "hdmi-phy",
1108         },
1109         .bits = {
1110             .pxx = IMX8MP_HDMI_PHY_Pxx_REQ,
1111             .map = IMX8MP_HDMI_PHY_A53_DOMAIN,
1112         },
1113         .pgc = BIT(IMX8MP_PGC_HDMI),
1114     },
1115 
1116     [IMX8MP_POWER_DOMAIN_MIPI_PHY2] = {
1117         .genpd = {
1118             .name = "mipi-phy2",
1119         },
1120         .bits = {
1121             .pxx = IMX8MP_MIPI_PHY2_Pxx_REQ,
1122             .map = IMX8MP_MIPI_PHY2_A53_DOMAIN,
1123         },
1124         .pgc = BIT(IMX8MP_PGC_MIPI2),
1125     },
1126 
1127     [IMX8MP_POWER_DOMAIN_HSIOMIX] = {
1128         .genpd = {
1129             .name = "hsiomix",
1130         },
1131         .bits = {
1132             .pxx = IMX8MP_HSIOMIX_Pxx_REQ,
1133             .map = IMX8MP_HSIOMIX_A53_DOMAIN,
1134             .hskreq = IMX8MP_HSIOMIX_PWRDNREQN,
1135             .hskack = IMX8MP_HSIOMIX_PWRDNACKN,
1136         },
1137         .pgc = BIT(IMX8MP_PGC_HSIOMIX),
1138         .keep_clocks = true,
1139     },
1140 
1141     [IMX8MP_POWER_DOMAIN_MEDIAMIX_ISPDWP] = {
1142         .genpd = {
1143             .name = "mediamix-isp-dwp",
1144         },
1145         .bits = {
1146             .pxx = IMX8MP_MEDIA_ISP_DWP_Pxx_REQ,
1147             .map = IMX8MP_MEDIA_ISPDWP_A53_DOMAIN,
1148         },
1149         .pgc = BIT(IMX8MP_PGC_MEDIA_ISP_DWP),
1150     },
1151 };
1152 
1153 static const struct regmap_range imx8mp_yes_ranges[] = {
1154         regmap_reg_range(GPC_LPCR_A_CORE_BSC,
1155                  IMX8MP_GPC_PGC_CPU_MAPPING),
1156         regmap_reg_range(GPC_PGC_CTRL(IMX8MP_PGC_NOC),
1157                  GPC_PGC_SR(IMX8MP_PGC_NOC)),
1158         regmap_reg_range(GPC_PGC_CTRL(IMX8MP_PGC_MIPI1),
1159                  GPC_PGC_SR(IMX8MP_PGC_MIPI1)),
1160         regmap_reg_range(GPC_PGC_CTRL(IMX8MP_PGC_PCIE),
1161                  GPC_PGC_SR(IMX8MP_PGC_PCIE)),
1162         regmap_reg_range(GPC_PGC_CTRL(IMX8MP_PGC_USB1),
1163                  GPC_PGC_SR(IMX8MP_PGC_USB1)),
1164         regmap_reg_range(GPC_PGC_CTRL(IMX8MP_PGC_USB2),
1165                  GPC_PGC_SR(IMX8MP_PGC_USB2)),
1166         regmap_reg_range(GPC_PGC_CTRL(IMX8MP_PGC_MLMIX),
1167                  GPC_PGC_SR(IMX8MP_PGC_MLMIX)),
1168         regmap_reg_range(GPC_PGC_CTRL(IMX8MP_PGC_AUDIOMIX),
1169                  GPC_PGC_SR(IMX8MP_PGC_AUDIOMIX)),
1170         regmap_reg_range(GPC_PGC_CTRL(IMX8MP_PGC_GPU2D),
1171                  GPC_PGC_SR(IMX8MP_PGC_GPU2D)),
1172         regmap_reg_range(GPC_PGC_CTRL(IMX8MP_PGC_GPUMIX),
1173                  GPC_PGC_SR(IMX8MP_PGC_GPUMIX)),
1174         regmap_reg_range(GPC_PGC_CTRL(IMX8MP_PGC_VPUMIX),
1175                  GPC_PGC_SR(IMX8MP_PGC_VPUMIX)),
1176         regmap_reg_range(GPC_PGC_CTRL(IMX8MP_PGC_GPU3D),
1177                  GPC_PGC_SR(IMX8MP_PGC_GPU3D)),
1178         regmap_reg_range(GPC_PGC_CTRL(IMX8MP_PGC_MEDIAMIX),
1179                  GPC_PGC_SR(IMX8MP_PGC_MEDIAMIX)),
1180         regmap_reg_range(GPC_PGC_CTRL(IMX8MP_PGC_VPU_G1),
1181                  GPC_PGC_SR(IMX8MP_PGC_VPU_G1)),
1182         regmap_reg_range(GPC_PGC_CTRL(IMX8MP_PGC_VPU_G2),
1183                  GPC_PGC_SR(IMX8MP_PGC_VPU_G2)),
1184         regmap_reg_range(GPC_PGC_CTRL(IMX8MP_PGC_VPU_VC8000E),
1185                  GPC_PGC_SR(IMX8MP_PGC_VPU_VC8000E)),
1186         regmap_reg_range(GPC_PGC_CTRL(IMX8MP_PGC_HDMIMIX),
1187                  GPC_PGC_SR(IMX8MP_PGC_HDMIMIX)),
1188         regmap_reg_range(GPC_PGC_CTRL(IMX8MP_PGC_HDMI),
1189                  GPC_PGC_SR(IMX8MP_PGC_HDMI)),
1190         regmap_reg_range(GPC_PGC_CTRL(IMX8MP_PGC_MIPI2),
1191                  GPC_PGC_SR(IMX8MP_PGC_MIPI2)),
1192         regmap_reg_range(GPC_PGC_CTRL(IMX8MP_PGC_HSIOMIX),
1193                  GPC_PGC_SR(IMX8MP_PGC_HSIOMIX)),
1194         regmap_reg_range(GPC_PGC_CTRL(IMX8MP_PGC_MEDIA_ISP_DWP),
1195                  GPC_PGC_SR(IMX8MP_PGC_MEDIA_ISP_DWP)),
1196         regmap_reg_range(GPC_PGC_CTRL(IMX8MP_PGC_DDRMIX),
1197                  GPC_PGC_SR(IMX8MP_PGC_DDRMIX)),
1198 };
1199 
1200 static const struct regmap_access_table imx8mp_access_table = {
1201     .yes_ranges = imx8mp_yes_ranges,
1202     .n_yes_ranges   = ARRAY_SIZE(imx8mp_yes_ranges),
1203 };
1204 
1205 static const struct imx_pgc_regs imx8mp_pgc_regs = {
1206     .map = IMX8MP_GPC_PGC_CPU_MAPPING,
1207     .pup = IMX8MP_GPC_PU_PGC_SW_PUP_REQ,
1208     .pdn = IMX8MP_GPC_PU_PGC_SW_PDN_REQ,
1209     .hsk = IMX8MP_GPC_PU_PWRHSK,
1210 };
1211 static const struct imx_pgc_domain_data imx8mp_pgc_domain_data = {
1212     .domains = imx8mp_pgc_domains,
1213     .domains_num = ARRAY_SIZE(imx8mp_pgc_domains),
1214     .reg_access_table = &imx8mp_access_table,
1215     .pgc_regs = &imx8mp_pgc_regs,
1216 };
1217 
1218 static const struct imx_pgc_domain imx8mn_pgc_domains[] = {
1219     [IMX8MN_POWER_DOMAIN_HSIOMIX] = {
1220         .genpd = {
1221             .name = "hsiomix",
1222         },
1223         .bits  = {
1224             .pxx = 0, /* no power sequence control */
1225             .map = 0, /* no power sequence control */
1226             .hskreq = IMX8MN_HSIO_HSK_PWRDNREQN,
1227             .hskack = IMX8MN_HSIO_HSK_PWRDNACKN,
1228         },
1229         .keep_clocks = true,
1230     },
1231 
1232     [IMX8MN_POWER_DOMAIN_OTG1] = {
1233         .genpd = {
1234             .name = "usb-otg1",
1235         },
1236         .bits  = {
1237             .pxx = IMX8MN_OTG1_SW_Pxx_REQ,
1238             .map = IMX8MN_OTG1_A53_DOMAIN,
1239         },
1240         .pgc   = BIT(IMX8MN_PGC_OTG1),
1241     },
1242 
1243     [IMX8MN_POWER_DOMAIN_GPUMIX] = {
1244         .genpd = {
1245             .name = "gpumix",
1246         },
1247         .bits  = {
1248             .pxx = IMX8MN_GPUMIX_SW_Pxx_REQ,
1249             .map = IMX8MN_GPUMIX_A53_DOMAIN,
1250             .hskreq = IMX8MN_GPUMIX_HSK_PWRDNREQN,
1251             .hskack = IMX8MN_GPUMIX_HSK_PWRDNACKN,
1252         },
1253         .pgc   = BIT(IMX8MN_PGC_GPUMIX),
1254         .keep_clocks = true,
1255     },
1256 
1257     [IMX8MN_POWER_DOMAIN_DISPMIX] = {
1258         .genpd = {
1259             .name = "dispmix",
1260         },
1261             .bits  = {
1262             .pxx = IMX8MN_DISPMIX_SW_Pxx_REQ,
1263             .map = IMX8MN_DISPMIX_A53_DOMAIN,
1264             .hskreq = IMX8MN_DISPMIX_HSK_PWRDNREQN,
1265             .hskack = IMX8MN_DISPMIX_HSK_PWRDNACKN,
1266         },
1267         .pgc   = BIT(IMX8MN_PGC_DISPMIX),
1268         .keep_clocks = true,
1269     },
1270 
1271     [IMX8MN_POWER_DOMAIN_MIPI] = {
1272         .genpd = {
1273             .name = "mipi",
1274         },
1275             .bits  = {
1276             .pxx = IMX8MN_MIPI_SW_Pxx_REQ,
1277             .map = IMX8MN_MIPI_A53_DOMAIN,
1278         },
1279         .pgc   = BIT(IMX8MN_PGC_MIPI),
1280     },
1281 };
1282 
1283 static const struct regmap_range imx8mn_yes_ranges[] = {
1284     regmap_reg_range(GPC_LPCR_A_CORE_BSC,
1285              GPC_PU_PWRHSK),
1286     regmap_reg_range(GPC_PGC_CTRL(IMX8MN_PGC_MIPI),
1287              GPC_PGC_SR(IMX8MN_PGC_MIPI)),
1288     regmap_reg_range(GPC_PGC_CTRL(IMX8MN_PGC_OTG1),
1289              GPC_PGC_SR(IMX8MN_PGC_OTG1)),
1290     regmap_reg_range(GPC_PGC_CTRL(IMX8MN_PGC_DDR1),
1291              GPC_PGC_SR(IMX8MN_PGC_DDR1)),
1292     regmap_reg_range(GPC_PGC_CTRL(IMX8MN_PGC_GPUMIX),
1293              GPC_PGC_SR(IMX8MN_PGC_GPUMIX)),
1294     regmap_reg_range(GPC_PGC_CTRL(IMX8MN_PGC_DISPMIX),
1295              GPC_PGC_SR(IMX8MN_PGC_DISPMIX)),
1296 };
1297 
1298 static const struct regmap_access_table imx8mn_access_table = {
1299     .yes_ranges = imx8mn_yes_ranges,
1300     .n_yes_ranges   = ARRAY_SIZE(imx8mn_yes_ranges),
1301 };
1302 
1303 static const struct imx_pgc_domain_data imx8mn_pgc_domain_data = {
1304     .domains = imx8mn_pgc_domains,
1305     .domains_num = ARRAY_SIZE(imx8mn_pgc_domains),
1306     .reg_access_table = &imx8mn_access_table,
1307     .pgc_regs = &imx7_pgc_regs,
1308 };
1309 
1310 static int imx_pgc_domain_probe(struct platform_device *pdev)
1311 {
1312     struct imx_pgc_domain *domain = pdev->dev.platform_data;
1313     int ret;
1314 
1315     domain->dev = &pdev->dev;
1316 
1317     domain->regulator = devm_regulator_get_optional(domain->dev, "power");
1318     if (IS_ERR(domain->regulator)) {
1319         if (PTR_ERR(domain->regulator) != -ENODEV)
1320             return dev_err_probe(domain->dev, PTR_ERR(domain->regulator),
1321                          "Failed to get domain's regulator\n");
1322     } else if (domain->voltage) {
1323         regulator_set_voltage(domain->regulator,
1324                       domain->voltage, domain->voltage);
1325     }
1326 
1327     domain->num_clks = devm_clk_bulk_get_all(domain->dev, &domain->clks);
1328     if (domain->num_clks < 0)
1329         return dev_err_probe(domain->dev, domain->num_clks,
1330                      "Failed to get domain's clocks\n");
1331 
1332     domain->reset = devm_reset_control_array_get_optional_exclusive(domain->dev);
1333     if (IS_ERR(domain->reset))
1334         return dev_err_probe(domain->dev, PTR_ERR(domain->reset),
1335                      "Failed to get domain's resets\n");
1336 
1337     pm_runtime_enable(domain->dev);
1338 
1339     if (domain->bits.map)
1340         regmap_update_bits(domain->regmap, domain->regs->map,
1341                    domain->bits.map, domain->bits.map);
1342 
1343     ret = pm_genpd_init(&domain->genpd, NULL, true);
1344     if (ret) {
1345         dev_err(domain->dev, "Failed to init power domain\n");
1346         goto out_domain_unmap;
1347     }
1348 
1349     if (IS_ENABLED(CONFIG_LOCKDEP) &&
1350         of_property_read_bool(domain->dev->of_node, "power-domains"))
1351         lockdep_set_subclass(&domain->genpd.mlock, 1);
1352 
1353     ret = of_genpd_add_provider_simple(domain->dev->of_node,
1354                        &domain->genpd);
1355     if (ret) {
1356         dev_err(domain->dev, "Failed to add genpd provider\n");
1357         goto out_genpd_remove;
1358     }
1359 
1360     return 0;
1361 
1362 out_genpd_remove:
1363     pm_genpd_remove(&domain->genpd);
1364 out_domain_unmap:
1365     if (domain->bits.map)
1366         regmap_update_bits(domain->regmap, domain->regs->map,
1367                    domain->bits.map, 0);
1368     pm_runtime_disable(domain->dev);
1369 
1370     return ret;
1371 }
1372 
1373 static int imx_pgc_domain_remove(struct platform_device *pdev)
1374 {
1375     struct imx_pgc_domain *domain = pdev->dev.platform_data;
1376 
1377     of_genpd_del_provider(domain->dev->of_node);
1378     pm_genpd_remove(&domain->genpd);
1379 
1380     if (domain->bits.map)
1381         regmap_update_bits(domain->regmap, domain->regs->map,
1382                    domain->bits.map, 0);
1383 
1384     pm_runtime_disable(domain->dev);
1385 
1386     return 0;
1387 }
1388 
1389 #ifdef CONFIG_PM_SLEEP
1390 static int imx_pgc_domain_suspend(struct device *dev)
1391 {
1392     int ret;
1393 
1394     /*
1395      * This may look strange, but is done so the generic PM_SLEEP code
1396      * can power down our domain and more importantly power it up again
1397      * after resume, without tripping over our usage of runtime PM to
1398      * power up/down the nested domains.
1399      */
1400     ret = pm_runtime_get_sync(dev);
1401     if (ret < 0) {
1402         pm_runtime_put_noidle(dev);
1403         return ret;
1404     }
1405 
1406     return 0;
1407 }
1408 
1409 static int imx_pgc_domain_resume(struct device *dev)
1410 {
1411     return pm_runtime_put(dev);
1412 }
1413 #endif
1414 
1415 static const struct dev_pm_ops imx_pgc_domain_pm_ops = {
1416     SET_SYSTEM_SLEEP_PM_OPS(imx_pgc_domain_suspend, imx_pgc_domain_resume)
1417 };
1418 
1419 static const struct platform_device_id imx_pgc_domain_id[] = {
1420     { "imx-pgc-domain", },
1421     { },
1422 };
1423 
1424 static struct platform_driver imx_pgc_domain_driver = {
1425     .driver = {
1426         .name = "imx-pgc",
1427         .pm = &imx_pgc_domain_pm_ops,
1428     },
1429     .probe    = imx_pgc_domain_probe,
1430     .remove   = imx_pgc_domain_remove,
1431     .id_table = imx_pgc_domain_id,
1432 };
1433 builtin_platform_driver(imx_pgc_domain_driver)
1434 
1435 static int imx_gpcv2_probe(struct platform_device *pdev)
1436 {
1437     const struct imx_pgc_domain_data *domain_data =
1438             of_device_get_match_data(&pdev->dev);
1439 
1440     struct regmap_config regmap_config = {
1441         .reg_bits   = 32,
1442         .val_bits   = 32,
1443         .reg_stride = 4,
1444         .rd_table   = domain_data->reg_access_table,
1445         .wr_table   = domain_data->reg_access_table,
1446         .max_register   = SZ_4K,
1447     };
1448     struct device *dev = &pdev->dev;
1449     struct device_node *pgc_np, *np;
1450     struct regmap *regmap;
1451     void __iomem *base;
1452     int ret;
1453 
1454     pgc_np = of_get_child_by_name(dev->of_node, "pgc");
1455     if (!pgc_np) {
1456         dev_err(dev, "No power domains specified in DT\n");
1457         return -EINVAL;
1458     }
1459 
1460     base = devm_platform_ioremap_resource(pdev, 0);
1461     if (IS_ERR(base))
1462         return PTR_ERR(base);
1463 
1464     regmap = devm_regmap_init_mmio(dev, base, &regmap_config);
1465     if (IS_ERR(regmap)) {
1466         ret = PTR_ERR(regmap);
1467         dev_err(dev, "failed to init regmap (%d)\n", ret);
1468         return ret;
1469     }
1470 
1471     for_each_child_of_node(pgc_np, np) {
1472         struct platform_device *pd_pdev;
1473         struct imx_pgc_domain *domain;
1474         u32 domain_index;
1475 
1476         if (!of_device_is_available(np))
1477             continue;
1478 
1479         ret = of_property_read_u32(np, "reg", &domain_index);
1480         if (ret) {
1481             dev_err(dev, "Failed to read 'reg' property\n");
1482             of_node_put(np);
1483             return ret;
1484         }
1485 
1486         if (domain_index >= domain_data->domains_num) {
1487             dev_warn(dev,
1488                  "Domain index %d is out of bounds\n",
1489                  domain_index);
1490             continue;
1491         }
1492 
1493         pd_pdev = platform_device_alloc("imx-pgc-domain",
1494                         domain_index);
1495         if (!pd_pdev) {
1496             dev_err(dev, "Failed to allocate platform device\n");
1497             of_node_put(np);
1498             return -ENOMEM;
1499         }
1500 
1501         ret = platform_device_add_data(pd_pdev,
1502                            &domain_data->domains[domain_index],
1503                            sizeof(domain_data->domains[domain_index]));
1504         if (ret) {
1505             platform_device_put(pd_pdev);
1506             of_node_put(np);
1507             return ret;
1508         }
1509 
1510         domain = pd_pdev->dev.platform_data;
1511         domain->regmap = regmap;
1512         domain->regs = domain_data->pgc_regs;
1513 
1514         domain->genpd.power_on  = imx_pgc_power_up;
1515         domain->genpd.power_off = imx_pgc_power_down;
1516 
1517         pd_pdev->dev.parent = dev;
1518         pd_pdev->dev.of_node = np;
1519 
1520         ret = platform_device_add(pd_pdev);
1521         if (ret) {
1522             platform_device_put(pd_pdev);
1523             of_node_put(np);
1524             return ret;
1525         }
1526     }
1527 
1528     return 0;
1529 }
1530 
1531 static const struct of_device_id imx_gpcv2_dt_ids[] = {
1532     { .compatible = "fsl,imx7d-gpc", .data = &imx7_pgc_domain_data, },
1533     { .compatible = "fsl,imx8mm-gpc", .data = &imx8mm_pgc_domain_data, },
1534     { .compatible = "fsl,imx8mn-gpc", .data = &imx8mn_pgc_domain_data, },
1535     { .compatible = "fsl,imx8mp-gpc", .data = &imx8mp_pgc_domain_data, },
1536     { .compatible = "fsl,imx8mq-gpc", .data = &imx8m_pgc_domain_data, },
1537     { }
1538 };
1539 
1540 static struct platform_driver imx_gpc_driver = {
1541     .driver = {
1542         .name = "imx-gpcv2",
1543         .of_match_table = imx_gpcv2_dt_ids,
1544     },
1545     .probe = imx_gpcv2_probe,
1546 };
1547 builtin_platform_driver(imx_gpc_driver)