void omap_pm_set_max_dev_wakeup_lat(struct device *dev, long t) { struct omapdev *odev; struct powerdomain *pwrdm_dev; struct platform_device *pdev; char *lat_res_name; if (!dev || t < -1) { WARN_ON(1); return; }; /* Look for the devices Power Domain */ /* * WARNING! If device is not a platform device, container_of will * return a pointer to unknown memory! * TODO: Either change omap-pm interface to support only platform * devices, or change the underlying omapdev implementation to * support normal devices. */ pdev = container_of(dev, struct platform_device, dev); /* Try to catch non platform devices. */ if (pdev->name == NULL) { printk(KERN_ERR "OMAP-PM: Error: platform device not valid\n"); return; } odev = omapdev_find_pdev(pdev); if (odev) { pwrdm_dev = omapdev_get_pwrdm(odev); } else { printk(KERN_ERR "OMAP-PM: Error: Could not find omapdev " "for %s\n", pdev->name); return; } lat_res_name = kmalloc(MAX_LATENCY_RES_NAME, GFP_KERNEL); if (!lat_res_name) { printk(KERN_ERR "OMAP-PM: FATAL ERROR: kmalloc failed\n"); return; } get_lat_res_name(pwrdm_dev->name, &lat_res_name, MAX_LATENCY_RES_NAME); if (t == -1) { pr_debug("OMAP PM: remove max device latency constraint: " "dev %s\n", dev_name(dev)); resource_release(lat_res_name, dev); } else { pr_debug("OMAP PM: add max device latency constraint: " "dev %s, t = %ld usec\n", dev_name(dev), t); resource_request(lat_res_name, dev, t); } kfree(lat_res_name); return; }
int get_last_off_on_transaction_id(struct device *dev) { struct platform_device *pdev = to_platform_device(dev); struct omapdev *odev = omapdev_find_pdev(pdev); struct powerdomain *pwrdm; if (odev) { pwrdm = omapdev_get_pwrdm(odev); if (pwrdm) return pwrdm->state_counter[0] & INT_MAX; } return 0; }