--- /dev/null
+#ifndef __PVR_H
+#define __PVR_H
+
+struct sgx_platform_data {
+ unsigned long fclock_max;
+};
+
+#endif
PVR_TRACE("pvr_probe(pdev=%p)", pdev);
if (SysAcquireData(&sysdata) != PVRSRV_OK &&
- SysInitialise() != PVRSRV_OK) {
+ SysInitialise(pdev) != PVRSRV_OK) {
ret = -ENODEV;
goto err_exit;
}
#include "device.h"
#include "buffer_manager.h"
+#include <linux/platform_device.h>
+#include <linux/pvr.h>
+
#if defined(NO_HARDWARE) && defined(__KERNEL__)
#include <linux/io.h>
#endif
#endif
};
-enum PVRSRV_ERROR SysInitialise(void);
+enum PVRSRV_ERROR SysInitialise(struct platform_device *spd);
enum PVRSRV_ERROR SysFinalise(void);
enum PVRSRV_ERROR SysDeinitialise(struct SYS_DATA *psSysData);
*
******************************************************************************/
+#include <linux/platform_device.h>
+
#include "services_headers.h"
#include "kerneldisplay.h"
#include "oemfuncs.h"
unsigned long sgx_get_max_freq(void)
{
+ struct SYS_SPECIFIC_DATA *sysd = gpsSysSpecificData;
+
+ BUG_ON(!sysd);
+
+ if (sysd->sgx_fck_max)
+ return sysd->sgx_fck_max;
+
+ /*
+ * In case there's no board specific setting for this, return
+ * some revision specific defaults.
+ */
if (sgx_is_530()) {
switch (sgx_get_rev()) {
case EUR_CR_CORE_MAKE_REV(1, 2, 1):
OSWriteHWReg(ocp_base, reg, val);
}
-enum PVRSRV_ERROR SysInitialise(void)
+enum PVRSRV_ERROR SysInitialise(struct platform_device *pdev)
{
u32 i;
enum PVRSRV_ERROR eError;
struct PVRSRV_DEVICE_NODE *psDeviceNode;
struct IMG_CPU_PHYADDR TimerRegPhysBase;
+ struct sgx_platform_data *spd;
gpsSysData = &gsSysData;
gpsSysData->pvSysSpecificData = gpsSysSpecificData;
+ spd = pdev->dev.platform_data;
+ if (spd)
+ gpsSysSpecificData->sgx_fck_max = spd->fclock_max;
+
eError = OSInitEnvData(&gpsSysData->pvEnvSpecificData);
if (eError != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR,
void __iomem *gpt_base;
#endif
struct constraint_handle *pVdd2Handle;
+
+ unsigned long sgx_fck_max;
};
extern struct SYS_SPECIFIC_DATA *gpsSysSpecificData;
struct SYS_SPECIFIC_DATA *psSysSpecData = psSysData->pvSysSpecificData;
struct clk *psCLK;
struct clk *core_ck = NULL;
+ int r;
psCLK = clk_get(NULL, "sgx_fck");
if (IS_ERR(psCLK))
}
clk_put(core_ck);
+ r = clk_set_rate(psSysSpecData->psSGX_FCK,
+ sgx_get_max_freq());
+ if (r < 0) {
+ unsigned long rate;
+
+ rate = clk_get_rate(psSysSpecData->psSGX_FCK);
+ rate /= 1000000;
+ pr_warning("error %d when setting SGX fclk to %luMHz, "
+ "falling back to %luMHz\n",
+ r, sgx_get_max_freq() / 1000000, rate);
+ }
+
RegisterConstraintNotifications(psSysSpecData);
return PVRSRV_OK;