Hi Jennifer,

This is looking better, thanks -- just a few more questions:

On Tue, Nov 16, 2010 at 02:05:16PM +0800, Jennifer Li (TP) wrote:
> Root cause:
> O2Micro's ADMA and related functions can't work by default Linux SD
> driver. We need mark those related registers.

If the goal is to disable ADMA, have you tried using the BROKEN_ADMA
quirk?  Like this:

static const struct sdhci_pci_fixes sdhci_o2 = {
        .probe          = o2_probe,
        .quirks         = SDHCI_QUIRK_BROKEN_ADMA,
};

If you do this, do you still need to perform the PCI writes?

> +             ret = pci_read_config_byte(chip->pdev, O2_SDMMC_MULTI_VCC3V, 
> &scratch);
> +             if (ret)
> +                     return ret;
> +
> +             scratch = 0x08;
> +             ret = pci_write_config_byte(chip->pdev, O2_SDMMC_MULTI_VCC3V, 
> scratch);

Here you read in a value to scratch, but then you go ahead and write
0x08 to the register regardless.  We can skip the read here, right?

> +             ret = pci_read_config_byte(chip->pdev, O2_SDMMC_CAPABILITIES, 
> &scratch);
> +             if (ret)
> +                     return ret;
> +
> +             scratch |= 0x01;
> +             ret = pci_write_config_byte(chip->pdev, O2_SDMMC_CAPABILITIES, 
> scratch);
> +
> +             ret = pci_read_config_byte(chip->pdev, O2_SDMMC_CAPABILITIES, 
> &scratch);
> +             if (ret)
> +                     return ret;
> +
> +             scratch = 0x73;
> +             ret = pci_write_config_byte(chip->pdev, O2_SDMMC_CAPABILITIES, 
> scratch);

Here you write a value to O2_SDMMC_CAPABILITIES that's dependent on the
read value, but then after that you immediately overwrite the register
with 0x73 regardless of what was in it before.  Why perform the first
read-and-write cycle and the second read, if you're just going to write
0x73 in the end?

> +
> +             ret = pci_read_config_byte(chip->pdev, O2_SDMMC_ADMA1, 
> &scratch);
> +             if (ret)
> +                     return ret;
> +
> +             scratch = 0x39;
> +             ret = pci_write_config_byte(chip->pdev, O2_SDMMC_ADMA1, 
> scratch);
> +
> +             ret = pci_read_config_byte(chip->pdev, O2_SDMMC_ADMA2, 
> &scratch);
> +             if (ret)
> +                     return ret;
> +
> +             scratch = 0x08;
> +             ret = pci_write_config_byte(chip->pdev, O2_SDMMC_ADMA2, 
> scratch);

Same as above -- if the write isn't dependent on the read, I don't see
why to bother with the read.  Also, you can avoid assigning the return
value of pci_write_config_byte() to "ret" now that we aren't testing that.

> Signed-off-by: Jennifer Li Developer <[email protected]>

I don't think "Developer" should be here, since the text should just be
your name.

Thanks,

-- 
Chris Ball   <[email protected]>   <http://printf.net/>
One Laptop Per Child
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to