unsigned long emc_freq_hz,
unsigned int bw_mbps,
struct dc_to_la_params disp_params);
+ int (*check_disp_la)(enum tegra_la_id id,
+ unsigned long emc_freq_hz,
+ unsigned int bw_mbps,
+ struct dc_to_la_params disp_params);
int (*set_la)(enum tegra_la_id id, unsigned int bw_mbps);
int (*enable_la_scaling)(enum tegra_la_id id,
unsigned int threshold_low,
return 0;
}
+/*
+ * Check if the passed bandwidth is possible.
+ *
+ * Returns zero if there is a possible LA value that can satifsy @bw_mbps at
+ * @emc_freq_hz. If no function has been defined for the active chip then this
+ * this function returns true (i.e 0).
+ */
+int tegra_check_disp_latency_allowance(enum tegra_la_id id,
+ unsigned long emc_freq_hz,
+ unsigned int bw_mbps,
+ struct dc_to_la_params disp_params) {
+ if (cs.check_disp_la)
+ return cs.check_disp_la(id, emc_freq_hz, bw_mbps, disp_params);
+ return 0;
+}
+
/* Sets latency allowance based on clients memory bandwitdh requirement.
* Bandwidth passed is in mega bytes per second.
*/
return T12X_LA_FP_TO_REAL(min_la_fp);
}
-static int t12x_set_disp_la(enum tegra_la_id id,
- unsigned long emc_freq_hz,
- unsigned int bw_mbps,
- struct dc_to_la_params disp_params)
+static int t12x_handle_disp_la(enum tegra_la_id id,
+ unsigned long emc_freq_hz,
+ unsigned int bw_mbps,
+ struct dc_to_la_params disp_params,
+ int write_la)
{
int idx = 0;
struct la_client_info *ci = NULL;
if (la_to_set < t12x_min_la(&disp_params))
return -1;
- program_la(ci, la_to_set);
+ if (write_la)
+ program_la(ci, la_to_set);
return 0;
}
+static int t12x_set_disp_la(enum tegra_la_id id,
+ unsigned long emc_freq_hz,
+ unsigned int bw_mbps,
+ struct dc_to_la_params disp_params)
+{
+ return t12x_handle_disp_la(id, emc_freq_hz, bw_mbps, disp_params, 1);
+}
+
+static int t12x_check_disp_la(enum tegra_la_id id,
+ unsigned long emc_freq_hz,
+ unsigned int bw_mbps,
+ struct dc_to_la_params disp_params)
+{
+ return t12x_handle_disp_la(id, emc_freq_hz, bw_mbps, disp_params, 0);
+}
+
void tegra_la_get_t12x_specific(struct la_chip_specific *cs_la)
{
int i = 0;
cs_la->update_camera_ptsa_rate = t12x_update_camera_ptsa_rate;
cs_la->set_la = t12x_set_la;
cs_la->set_disp_la = t12x_set_disp_la;
+ cs_la->check_disp_la = t12x_check_disp_la;
cs_la->save_ptsa = save_ptsa;
cs_la->program_ptsa = program_ptsa;
cs_la->suspend = la_suspend;
return LA_FP_TO_REAL(min_la_fp);
}
-static int t21x_set_disp_la(enum tegra_la_id id,
- unsigned long emc_freq_hz,
- unsigned int bw_mbps,
- struct dc_to_la_params disp_params)
+static int t21x_handle_disp_la(enum tegra_la_id id,
+ unsigned long emc_freq_hz,
+ unsigned int bw_mbps,
+ struct dc_to_la_params disp_params,
+ int write_la)
{
int idx = 0;
struct la_client_info *ci = NULL;
if ((la_to_set < t21x_min_la(&disp_params)) || (la_to_set > 255))
return -1;
- program_la(ci, la_to_set);
+ if (write_la)
+ program_la(ci, la_to_set);
return 0;
}
+static int t21x_set_disp_la(enum tegra_la_id id,
+ unsigned long emc_freq_hz,
+ unsigned int bw_mbps,
+ struct dc_to_la_params disp_params)
+{
+ return t21x_handle_disp_la(id, emc_freq_hz, bw_mbps, disp_params, 1);
+}
+
+static int t21x_check_disp_la(enum tegra_la_id id,
+ unsigned long emc_freq_hz,
+ unsigned int bw_mbps,
+ struct dc_to_la_params disp_params)
+{
+ return t21x_handle_disp_la(id, emc_freq_hz, bw_mbps, disp_params, 0);
+}
+
void tegra_la_get_t21x_specific(struct la_chip_specific *cs_la)
{
int i = 0;
cs_la->update_camera_ptsa_rate = t21x_update_camera_ptsa_rate;
cs_la->set_la = t21x_set_la;
cs_la->set_disp_la = t21x_set_disp_la;
+ cs_la->set_disp_la = t21x_check_disp_la;
cs_la->save_ptsa = save_ptsa;
cs_la->program_ptsa = program_ptsa;
cs_la->suspend = la_suspend;