0001
0002
0003
0004
0005
0006
0007
0008
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
0203
0204
0205
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
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
0348 udelay(5);
0349
0350 if (domain->bits.pxx) {
0351
0352 regmap_update_bits(domain->regmap, domain->regs->pup,
0353 domain->bits.pxx, domain->bits.pxx);
0354
0355
0356
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
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
0375 udelay(5);
0376
0377 reset_control_deassert(domain->reset);
0378
0379
0380 if (domain->bits.hskreq) {
0381 regmap_update_bits(domain->regmap, domain->regs->hsk,
0382 domain->bits.hskreq, domain->bits.hskreq);
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392
0393
0394
0395
0396 }
0397
0398
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
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
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
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
0453 regmap_update_bits(domain->regmap, domain->regs->pdn,
0454 domain->bits.pxx, domain->bits.pxx);
0455
0456
0457
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
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,
0737 .map = 0,
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,
1225 .map = 0,
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
1396
1397
1398
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, ®map_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)