static int bcm2835_thermal_probe(struct platform_device *pdev) { struct device_node *fw_np; struct rpi_firmware *fw; struct thermal_zone_device *tz; fw_np = of_parse_phandle(pdev->dev.of_node, "firmware", 0); /* Remove comment when booting without Device Tree is no longer supported if (!fw_np) { dev_err(&pdev->dev, "Missing firmware node\n"); return -ENOENT; } */ fw = rpi_firmware_get(fw_np); if (!fw) return -EPROBE_DEFER; tz = thermal_zone_device_register("bcm2835_thermal", 1, 0, fw, &ops, NULL, 0, 0); if (IS_ERR(tz)) { dev_err(&pdev->dev, "Failed to register the thermal device\n"); return PTR_ERR(tz); } platform_set_drvdata(pdev, tz); return 0; }
/* ============================================================== Initialisation function sets up the CPU policy for first use ============================================================== */ static int bcm2835_cpufreq_driver_init(struct cpufreq_policy *policy) { /* measured value of how long it takes to change frequency */ const unsigned int transition_latency = 355000; /* ns */ if (!rpi_firmware_get(NULL)) { print_err("Firmware is not available\n"); return -ENODEV; } /* now find out what the maximum and minimum frequencies are */ bcm2835_freq_table[0].frequency = bcm2835_cpufreq_get_clock(RPI_FIRMWARE_GET_MIN_CLOCK_RATE); bcm2835_freq_table[1].frequency = bcm2835_cpufreq_get_clock(RPI_FIRMWARE_GET_MAX_CLOCK_RATE); print_info("min=%d max=%d\n", bcm2835_freq_table[0].frequency, bcm2835_freq_table[1].frequency); return cpufreq_generic_init(policy, bcm2835_freq_table, transition_latency); }
static int bcm2835_cpufreq_clock_property(u32 tag, u32 id, u32 *val) { struct rpi_firmware *fw = rpi_firmware_get(NULL); struct { u32 id; u32 val; } packet; int ret; packet.id = id; packet.val = *val; ret = rpi_firmware_property(fw, tag, &packet, sizeof(packet)); if (ret) return ret; *val = packet.val; 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; }