mmc: tegra: Set correct tuning constraints
Naveen Kumar Arepalli [Fri, 14 Feb 2014 10:52:34 +0000 (15:52 +0530)]
-If we insert SDR50 card after removing SDR104 card,
tuning constraints of SDR104 are being set for SDR50.
This patch sets correct tuning constraints for SDR50 mode
card

Bug 1423425

Reviewed-on: http://git-master/r/367708
(cherry picked from commit 9a9b70233c0669c6c3e26ec525a56b350b971657)

Change-Id: I14150ff7bdbb2387d185a6d800d5160dc0fa54bc
Signed-off-by: Naveen Kumar Arepalli <naveenk@nvidia.com>
Reviewed-on: http://git-master/r/369823
(cherry picked from commit edc48c9254e9d3aea84ca652a1966ea587f191cc)
Reviewed-on: http://git-master/r/410198
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Shreshtha Sahu <ssahu@nvidia.com>
Tested-by: Shreshtha Sahu <ssahu@nvidia.com>
Reviewed-by: Venkat Moganty <vmoganty@nvidia.com>

drivers/mmc/host/sdhci-tegra.c

index 9be59f9..11620b6 100644 (file)
@@ -2737,7 +2737,8 @@ static u8 sdhci_tegra_get_freq_point(struct sdhci_host *sdhci)
  * UI and estimate holes using equations and predetermined coefficients from
  * the characterization data. The algorithm will not work without this data.
  */
-static int find_tuning_coeffs_data(struct sdhci_host *sdhci)
+static int find_tuning_coeffs_data(struct sdhci_host *sdhci,
+                                       bool force_retuning)
 {
        struct sdhci_pltfm_host *pltfm_host = sdhci_priv(sdhci);
        struct sdhci_tegra *tegra_host = pltfm_host->priv;
@@ -2756,7 +2757,7 @@ static int find_tuning_coeffs_data(struct sdhci_host *sdhci)
                tuning_data = &tegra_host->tuning_data[i];
 
                /* Skip if T2T coeffs are already found */
-               if (tuning_data->t2t_coeffs == NULL) {
+               if (tuning_data->t2t_coeffs == NULL || force_retuning) {
                        t2t_coeffs = soc_data->t2t_coeffs;
                        for (j = 0; j < soc_data->t2t_coeffs_count; j++) {
                                if (!strcmp(dev_id, t2t_coeffs->dev_id)) {
@@ -2778,7 +2779,7 @@ static int find_tuning_coeffs_data(struct sdhci_host *sdhci)
 
                coeffs_set = false;
                /* Skip if tap hole coeffs are already found */
-               if (tuning_data->thole_coeffs == NULL) {
+               if (tuning_data->thole_coeffs == NULL || force_retuning) {
                        thole_coeffs = soc_data->tap_hole_coeffs;
                        freq_khz = tuning_data->freq_hz / 1000;
                        for (j = 0; j < soc_data->tap_hole_coeffs_count; j++) {
@@ -2877,7 +2878,8 @@ static int setup_freq_constraints(struct sdhci_host *sdhci,
  * frequencies in the soc data and also consider the platform clock limits as
  * well as any DFS related restrictions.
  */
-static int sdhci_tegra_get_tuning_constraints(struct sdhci_host *sdhci)
+static int sdhci_tegra_get_tuning_constraints(struct sdhci_host *sdhci,
+                                                       bool force_retuning)
 {
        struct sdhci_pltfm_host *pltfm_host = sdhci_priv(sdhci);
        struct sdhci_tegra *tegra_host = pltfm_host->priv;
@@ -2885,7 +2887,7 @@ static int sdhci_tegra_get_tuning_constraints(struct sdhci_host *sdhci)
        int err = 0;
 
        /* A valid freq count means freq constraints are already set up */
-       if (!tegra_host->tuning_freq_count) {
+       if (!tegra_host->tuning_freq_count || force_retuning) {
                freq_list = tegra_host->soc_data->tuning_freq_list;
                tegra_host->tuning_freq_count =
                        setup_freq_constraints(sdhci, freq_list);
@@ -2896,7 +2898,7 @@ static int sdhci_tegra_get_tuning_constraints(struct sdhci_host *sdhci)
                }
        }
 
-       err = find_tuning_coeffs_data(sdhci);
+       err = find_tuning_coeffs_data(sdhci, force_retuning);
        if (err)
                return err;
 
@@ -3100,7 +3102,7 @@ static int sdhci_tegra_execute_tuning(struct sdhci_host *sdhci, u32 opcode)
        }
 
        tegra_host->tuning_status = 0;
-       err = sdhci_tegra_get_tuning_constraints(sdhci);
+       err = sdhci_tegra_get_tuning_constraints(sdhci, force_retuning);
        if (err) {
                dev_err(mmc_dev(sdhci->mmc),
                        "Failed to get tuning constraints\n");