aboutsummaryrefslogtreecommitdiff
path: root/drivers/mmc/host
diff options
context:
space:
mode:
authorAndy Green <agreen@pads.home.warmcat.com>2008-11-19 17:11:26 +0000
committerAndy Green <agreen@pads.home.warmcat.com>2008-11-19 17:11:26 +0000
commitf5edc32b7f652cf2ff423de68aed17fa4ac5b67f (patch)
tree030c65d8df91e0c905ba855802267c9f6d20784e /drivers/mmc/host
parent94447a8f14ff2e5c5910d55a84cf5040f2671e4e (diff)
debug-s3cmci-fmax.patch
This patch adds the module parameter f_max to s3cmci to limit the maximum clock frequency of the SD interface. E.g., when booting with s3cmci.f_max=10000000, the kernel should say s3c2440-sdi s3c2440-sdi: f_max lowered from 50000000 to 10000000 Hz and the interface frequency should be limited accordingly. Setting the limit above the maximum frequency supported by the card or the interface has no effect, so the option is ignored (and no "f_max lowered" line is printed). Setting the limit below the minimum frequency supported by the interface sets it to that frequency. Signed-off-by: Werner Almesberger <werner@openmoko.org>
Diffstat (limited to 'drivers/mmc/host')
-rw-r--r--drivers/mmc/host/s3cmci.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/mmc/host/s3cmci.c b/drivers/mmc/host/s3cmci.c
index bf4df3a82f8..45f5e21a100 100644
--- a/drivers/mmc/host/s3cmci.c
+++ b/drivers/mmc/host/s3cmci.c
@@ -56,6 +56,8 @@ static const int dbgmap_err = dbg_fail;
static const int dbgmap_info = dbg_info | dbg_conf;
static const int dbgmap_debug = dbg_err | dbg_debug;
+static int f_max = -1; /* override maximum frequency limit */
+
#define dbg(host, channels, args...) \
do { \
if (dbgmap_err & channels) \
@@ -1394,6 +1396,18 @@ static int __devinit s3cmci_probe(struct platform_device *pdev, int is2440)
mmc->f_min = host->clk_rate / (host->clk_div * 256);
mmc->f_max = host->clk_rate / host->clk_div;
+ if (f_max >= 0) {
+ unsigned f = f_max;
+
+ if (f < mmc->f_min)
+ f = mmc->f_min;
+ if (mmc->f_max > f) {
+ dev_info(&pdev->dev, "f_max lowered from %u to %u Hz\n",
+ mmc->f_max, f);
+ mmc->f_max = f;
+ }
+ }
+
if (host->pdata->ocr_avail)
mmc->ocr_avail = host->pdata->ocr_avail;
@@ -1575,6 +1589,8 @@ static void __exit s3cmci_exit(void)
module_init(s3cmci_init);
module_exit(s3cmci_exit);
+module_param(f_max, int, 0644)
+
MODULE_DESCRIPTION("Samsung S3C MMC/SD Card Interface driver");
MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Thomas Kleffel <tk@maintech.de>, Ben Dooks <ben-linux@fluff.org>");