disp: msm: sde: parse MDSS HW from device tree
Get the MDSS HW version from the device tree instead of reading directly from the hardware register. Change-Id: Icfb7a80c8f19312001b070a454741421fd67aae5 Signed-off-by: Veera Sundaram Sankaran <veeras@codeaurora.org>
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

parent
d38d91b9f3
commit
7245366343
@@ -161,6 +161,11 @@
|
||||
/*************************************************************
|
||||
* DTSI PROPERTY INDEX
|
||||
*************************************************************/
|
||||
enum {
|
||||
SDE_HW_VERSION,
|
||||
SDE_HW_PROP_MAX,
|
||||
};
|
||||
|
||||
enum {
|
||||
HW_OFF,
|
||||
HW_LEN,
|
||||
@@ -524,6 +529,10 @@ struct sde_dt_props {
|
||||
/*************************************************************
|
||||
* dts property list
|
||||
*************************************************************/
|
||||
static struct sde_prop_type sde_hw_prop[] = {
|
||||
{SDE_HW_VERSION, "qcom,sde-hw-version", false, PROP_TYPE_U32},
|
||||
};
|
||||
|
||||
static struct sde_prop_type sde_prop[] = {
|
||||
{SDE_OFF, "qcom,sde-off", true, PROP_TYPE_U32},
|
||||
{SDE_LEN, "qcom,sde-len", false, PROP_TYPE_U32},
|
||||
@@ -4790,10 +4799,48 @@ void sde_hw_catalog_deinit(struct sde_mdss_cfg *sde_cfg)
|
||||
kfree(sde_cfg);
|
||||
}
|
||||
|
||||
static int sde_hw_ver_parse_dt(struct drm_device *dev, struct device_node *np,
|
||||
struct sde_mdss_cfg *cfg)
|
||||
{
|
||||
int rc, len, prop_count[SDE_HW_PROP_MAX];
|
||||
struct sde_prop_value *prop_value = NULL;
|
||||
bool prop_exists[SDE_HW_PROP_MAX];
|
||||
|
||||
if (!cfg) {
|
||||
SDE_ERROR("invalid argument\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
prop_value = kzalloc(SDE_HW_PROP_MAX *
|
||||
sizeof(struct sde_prop_value), GFP_KERNEL);
|
||||
if (!prop_value)
|
||||
return -ENOMEM;
|
||||
|
||||
rc = _validate_dt_entry(np, sde_hw_prop, ARRAY_SIZE(sde_hw_prop),
|
||||
prop_count, &len);
|
||||
if (rc)
|
||||
goto end;
|
||||
|
||||
rc = _read_dt_entry(np, sde_hw_prop, ARRAY_SIZE(sde_hw_prop),
|
||||
prop_count, prop_exists, prop_value);
|
||||
if (rc)
|
||||
goto end;
|
||||
|
||||
if (prop_exists[SDE_HW_VERSION])
|
||||
cfg->hwversion = PROP_VALUE_ACCESS(prop_value,
|
||||
SDE_HW_VERSION, 0);
|
||||
else
|
||||
cfg->hwversion = sde_kms_get_hw_version(dev);
|
||||
|
||||
end:
|
||||
kfree(prop_value);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
* hardware catalog init
|
||||
*************************************************************/
|
||||
struct sde_mdss_cfg *sde_hw_catalog_init(struct drm_device *dev, u32 hw_rev)
|
||||
struct sde_mdss_cfg *sde_hw_catalog_init(struct drm_device *dev)
|
||||
{
|
||||
int rc;
|
||||
struct sde_mdss_cfg *sde_cfg;
|
||||
@@ -4806,10 +4853,13 @@ struct sde_mdss_cfg *sde_hw_catalog_init(struct drm_device *dev, u32 hw_rev)
|
||||
if (!sde_cfg)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
sde_cfg->hwversion = hw_rev;
|
||||
INIT_LIST_HEAD(&sde_cfg->irq_offset_list);
|
||||
|
||||
rc = _sde_hardware_pre_caps(sde_cfg, hw_rev);
|
||||
rc = sde_hw_ver_parse_dt(dev, np, sde_cfg);
|
||||
if (rc)
|
||||
goto end;
|
||||
|
||||
rc = _sde_hardware_pre_caps(sde_cfg, sde_cfg->hwversion);
|
||||
if (rc)
|
||||
goto end;
|
||||
|
||||
@@ -4905,7 +4955,7 @@ struct sde_mdss_cfg *sde_hw_catalog_init(struct drm_device *dev, u32 hw_rev)
|
||||
if (rc)
|
||||
goto end;
|
||||
|
||||
rc = _sde_hardware_post_caps(sde_cfg, hw_rev);
|
||||
rc = _sde_hardware_post_caps(sde_cfg, sde_cfg->hwversion);
|
||||
if (rc)
|
||||
goto end;
|
||||
|
||||
|
@@ -1602,11 +1602,10 @@ void sde_hw_mixer_set_preference(struct sde_mdss_cfg *sde_cfg, u32 num_lm,
|
||||
* sde_hw_catalog_init - sde hardware catalog init API parses dtsi property
|
||||
* and stores all parsed offset, hardware capabilities in config structure.
|
||||
* @dev: drm device node.
|
||||
* @hw_rev: caller needs provide the hardware revision before parsing.
|
||||
*
|
||||
* Return: parsed sde config structure
|
||||
*/
|
||||
struct sde_mdss_cfg *sde_hw_catalog_init(struct drm_device *dev, u32 hw_rev);
|
||||
struct sde_mdss_cfg *sde_hw_catalog_init(struct drm_device *dev);
|
||||
|
||||
/**
|
||||
* sde_hw_catalog_deinit - sde hardware catalog cleanup
|
||||
|
@@ -2839,12 +2839,6 @@ static const struct msm_kms_funcs kms_funcs = {
|
||||
.get_mixer_count = sde_kms_get_mixer_count,
|
||||
};
|
||||
|
||||
/* the caller api needs to turn on clock before calling it */
|
||||
static inline void _sde_kms_core_hw_rev_init(struct sde_kms *sde_kms)
|
||||
{
|
||||
sde_kms->core_rev = readl_relaxed(sde_kms->mmio + 0x0);
|
||||
}
|
||||
|
||||
static int _sde_kms_mmu_destroy(struct sde_kms *sde_kms)
|
||||
{
|
||||
int i;
|
||||
@@ -3325,11 +3319,7 @@ static int _sde_kms_hw_init_blocks(struct sde_kms *sde_kms,
|
||||
struct sde_rm *rm = NULL;
|
||||
int i, rc = -EINVAL;
|
||||
|
||||
_sde_kms_core_hw_rev_init(sde_kms);
|
||||
|
||||
pr_info("sde hardware revision:0x%x\n", sde_kms->core_rev);
|
||||
|
||||
sde_kms->catalog = sde_hw_catalog_init(dev, sde_kms->core_rev);
|
||||
sde_kms->catalog = sde_hw_catalog_init(dev);
|
||||
if (IS_ERR_OR_NULL(sde_kms->catalog)) {
|
||||
rc = PTR_ERR(sde_kms->catalog);
|
||||
if (!sde_kms->catalog)
|
||||
@@ -3338,6 +3328,9 @@ static int _sde_kms_hw_init_blocks(struct sde_kms *sde_kms,
|
||||
sde_kms->catalog = NULL;
|
||||
goto power_error;
|
||||
}
|
||||
sde_kms->core_rev = sde_kms->catalog->hwversion;
|
||||
|
||||
pr_info("sde hardware revision:0x%x\n", sde_kms->core_rev);
|
||||
|
||||
/* initialize power domain if defined */
|
||||
rc = _sde_kms_hw_init_power_helper(dev, sde_kms);
|
||||
|
@@ -323,6 +323,23 @@ struct vsync_info {
|
||||
*/
|
||||
bool sde_is_custom_client(void);
|
||||
|
||||
/**
|
||||
* sde_kms_get_hw_version - get the hw revision - client is expected to
|
||||
* enable the power resources before making this call
|
||||
* @dev: Pointer to drm device
|
||||
*/
|
||||
static inline u32 sde_kms_get_hw_version(struct drm_device *dev)
|
||||
{
|
||||
struct sde_kms *sde_kms;
|
||||
|
||||
if (!ddev_to_msm_kms(dev))
|
||||
return 0;
|
||||
|
||||
sde_kms = to_sde_kms(ddev_to_msm_kms(dev));
|
||||
|
||||
return readl_relaxed(sde_kms->mmio + 0x0);
|
||||
}
|
||||
|
||||
/**
|
||||
* sde_kms_power_resource_is_enabled - whether or not power resource is enabled
|
||||
* @dev: Pointer to drm device
|
||||
|
Reference in New Issue
Block a user