static void mtk_register_power_domains(struct platform_device *pdev, struct scp *scp, int num) { struct genpd_onecell_data *pd_data; int i, ret; for (i = 0; i < num; i++) { struct scp_domain *scpd = &scp->domains[i]; struct generic_pm_domain *genpd = &scpd->genpd; /* * Initially turn on all domains to make the domains usable * with !CONFIG_PM and to get the hardware in sync with the * software. The unused domains will be switched off during * late_init time. */ genpd->power_on(genpd); pm_genpd_init(genpd, NULL, false); } /* * We are not allowed to fail here since there is no way to unregister * a power domain. Once registered above we have to keep the domains * valid. */ pd_data = &scp->pd_data; ret = of_genpd_add_provider_onecell(pdev->dev.of_node, pd_data); if (ret) dev_err(&pdev->dev, "Failed to add OF provider: %d\n", ret); }
int gdsc_register(struct device *dev, struct gdsc **scs, size_t num, struct reset_controller_dev *rcdev, struct regmap *regmap) { int i, ret; struct genpd_onecell_data *data; data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); if (!data) return -ENOMEM; data->domains = devm_kcalloc(dev, num, sizeof(*data->domains), GFP_KERNEL); if (!data->domains) return -ENOMEM; data->num_domains = num; for (i = 0; i < num; i++) { if (!scs[i]) continue; scs[i]->regmap = regmap; scs[i]->rcdev = rcdev; ret = gdsc_init(scs[i]); if (ret) return ret; data->domains[i] = &scs[i]->pd; } return of_genpd_add_provider_onecell(dev->of_node, data); }
static int owl_sps_probe(struct platform_device *pdev) { const struct of_device_id *match; const struct owl_sps_info *sps_info; struct owl_sps *sps; int i, ret; if (!pdev->dev.of_node) { dev_err(&pdev->dev, "no device node\n"); return -ENODEV; } match = of_match_device(pdev->dev.driver->of_match_table, &pdev->dev); if (!match || !match->data) { dev_err(&pdev->dev, "unknown compatible or missing data\n"); return -EINVAL; } sps_info = match->data; sps = devm_kzalloc(&pdev->dev, sizeof(*sps) + sps_info->num_domains * sizeof(sps->domains[0]), GFP_KERNEL); if (!sps) return -ENOMEM; sps->base = of_io_request_and_map(pdev->dev.of_node, 0, "owl-sps"); if (IS_ERR(sps->base)) { dev_err(&pdev->dev, "failed to map sps registers\n"); return PTR_ERR(sps->base); } sps->dev = &pdev->dev; sps->info = sps_info; sps->genpd_data.domains = sps->domains; sps->genpd_data.num_domains = sps_info->num_domains; for (i = 0; i < sps_info->num_domains; i++) { ret = owl_sps_init_domain(sps, i); if (ret) return ret; } ret = of_genpd_add_provider_onecell(pdev->dev.of_node, &sps->genpd_data); if (ret) { dev_err(&pdev->dev, "failed to add provider (%d)", ret); return ret; } return 0; }
int __init ux500_pm_domains_init(void) { struct device_node *np; struct genpd_onecell_data *genpd_data; int i; np = of_find_matching_node(NULL, ux500_pm_domain_matches); if (!np) return -ENODEV; genpd_data = kzalloc(sizeof(*genpd_data), GFP_KERNEL); if (!genpd_data) return -ENOMEM; genpd_data->domains = ux500_pm_domains; genpd_data->num_domains = ARRAY_SIZE(ux500_pm_domains); for (i = 0; i < ARRAY_SIZE(ux500_pm_domains); ++i) pm_genpd_init(ux500_pm_domains[i], NULL, NULL, 0, false); of_genpd_add_provider_onecell(np, genpd_data); return 0; }
static int rpi_power_probe(struct platform_device *pdev) { struct device_node *fw_np; struct device *dev = &pdev->dev; struct rpi_power_domains *rpi_domains; rpi_domains = devm_kzalloc(dev, sizeof(*rpi_domains), GFP_KERNEL); if (!rpi_domains) return -ENOMEM; rpi_domains->xlate.domains = devm_kcalloc(dev, RPI_POWER_DOMAIN_COUNT, sizeof(*rpi_domains->xlate.domains), GFP_KERNEL); if (!rpi_domains->xlate.domains) return -ENOMEM; rpi_domains->xlate.num_domains = RPI_POWER_DOMAIN_COUNT; fw_np = of_parse_phandle(pdev->dev.of_node, "firmware", 0); if (!fw_np) { dev_err(&pdev->dev, "no firmware node\n"); return -ENODEV; } rpi_domains->fw = rpi_firmware_get(fw_np); of_node_put(fw_np); if (!rpi_domains->fw) return -EPROBE_DEFER; rpi_domains->has_new_interface = rpi_has_new_domain_support(rpi_domains); rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_I2C0, "I2C0"); rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_I2C1, "I2C1"); rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_I2C2, "I2C2"); rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_VIDEO_SCALER, "VIDEO_SCALER"); rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_VPU1, "VPU1"); rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_HDMI, "HDMI"); /* * Use the old firmware interface for USB power, so that we * can turn it on even if the firmware hasn't been updated. */ rpi_init_old_power_domain(rpi_domains, RPI_POWER_DOMAIN_USB, RPI_OLD_POWER_DOMAIN_USB, "USB"); rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_VEC, "VEC"); rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_JPEG, "JPEG"); rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_H264, "H264"); rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_V3D, "V3D"); rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_ISP, "ISP"); rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_UNICAM0, "UNICAM0"); rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_UNICAM1, "UNICAM1"); rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_CCP2RX, "CCP2RX"); rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_CSI2, "CSI2"); rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_CPI, "CPI"); rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_DSI0, "DSI0"); rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_DSI1, "DSI1"); rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_TRANSPOSER, "TRANSPOSER"); rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_CCP2TX, "CCP2TX"); rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_CDP, "CDP"); rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_ARM, "ARM"); of_genpd_add_provider_onecell(dev->of_node, &rpi_domains->xlate); platform_set_drvdata(pdev, rpi_domains); return 0; }
static int scpi_pm_domain_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *np = dev->of_node; struct scpi_pm_domain *scpi_pd; struct genpd_onecell_data *scpi_pd_data; struct generic_pm_domain **domains; struct scpi_ops *scpi_ops; int ret, num_domains, i; scpi_ops = get_scpi_ops(); if (!scpi_ops) return -EPROBE_DEFER; if (!np) { dev_err(dev, "device tree node not found\n"); return -ENODEV; } if (!scpi_ops->device_set_power_state || !scpi_ops->device_get_power_state) { dev_err(dev, "power domains not supported in the firmware\n"); return -ENODEV; } ret = of_property_read_u32(np, "num-domains", &num_domains); if (ret) { dev_err(dev, "number of domains not found\n"); return -EINVAL; } scpi_pd = devm_kcalloc(dev, num_domains, sizeof(*scpi_pd), GFP_KERNEL); if (!scpi_pd) return -ENOMEM; scpi_pd_data = devm_kzalloc(dev, sizeof(*scpi_pd_data), GFP_KERNEL); if (!scpi_pd_data) return -ENOMEM; domains = devm_kcalloc(dev, num_domains, sizeof(*domains), GFP_KERNEL); if (!domains) return -ENOMEM; for (i = 0; i < num_domains; i++, scpi_pd++) { domains[i] = &scpi_pd->genpd; scpi_pd->domain = i; scpi_pd->ops = scpi_ops; sprintf(scpi_pd->name, "%pOFn.%d", np, i); scpi_pd->genpd.name = scpi_pd->name; scpi_pd->genpd.power_off = scpi_pd_power_off; scpi_pd->genpd.power_on = scpi_pd_power_on; /* * Treat all power domains as off at boot. * * The SCP firmware itself may have switched on some domains, * but for reference counting purpose, keep it this way. */ pm_genpd_init(&scpi_pd->genpd, NULL, true); } scpi_pd_data->domains = domains; scpi_pd_data->num_domains = num_domains; of_genpd_add_provider_onecell(np, scpi_pd_data); return 0; }