aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/s3c24xx/patches-2.6.26/1230-add-glamo-mci-slower-clocking-dynamic-switching.patc.patch
blob: 74442df10fdc1241f063e908ce93c9761cbab9d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
From 911b448d4b528c403f973f9e5aa34be94bffaf1e Mon Sep 17 00:00:00 2001
From: Andy Green <andy@openmoko.com>
Date: Wed, 30 Jul 2008 14:37:01 +0100
Subject: [PATCH] add-glamo-mci-slower-clocking-dynamic-switching.patch

This patch gives glamo-mci a concept of a platform-defined
dynamic clock slowing callback.  It means that platform code
can associate some completely external state to decide if
we run the SD clock at normal rate or a rate divided by a
module parameter "sd_slow_ratio", which you can set on
kernel commandline like this:

glamo_mci.sd_slow_ratio=8

you can also change it at runtime by

echo 8 > /sys/module/glamo_mci/parameters/sd_slow_ratio

If no platform callback is defined, then no slow mode
is used.  If it is defined, then the default division
action is / 8, eg, 16MHz normal -> 2MHz slow mode.

Signed-off-by: Andy Green <andy@openmoko.com>
---
 drivers/mfd/glamo/glamo-core.c |    2 ++
 drivers/mfd/glamo/glamo-core.h |    2 ++
 drivers/mfd/glamo/glamo-mci.c  |   30 ++++++++++++++++++++++++++++--
 include/linux/glamofb.h        |    2 ++
 4 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/drivers/mfd/glamo/glamo-core.c b/drivers/mfd/glamo/glamo-core.c
index cb9b056..0e7a650 100644
--- a/drivers/mfd/glamo/glamo-core.c
+++ b/drivers/mfd/glamo/glamo-core.c
@@ -1116,6 +1116,8 @@ static int __init glamo_probe(struct platform_device *pdev)
 	/* bring MCI specific stuff over from our MFD platform data */
 	glamo_mci_def_pdata.glamo_set_mci_power =
 					glamo->pdata->glamo_set_mci_power;
+	glamo_mci_def_pdata.glamo_mci_use_slow =
+					glamo->pdata->glamo_mci_use_slow;
 	glamo_mci_def_pdata.glamo_irq_is_wired =
 					glamo->pdata->glamo_irq_is_wired;
 	glamo_mci_def_pdata.mci_suspending =
diff --git a/drivers/mfd/glamo/glamo-core.h b/drivers/mfd/glamo/glamo-core.h
index c89f810..dd6f67c 100644
--- a/drivers/mfd/glamo/glamo-core.h
+++ b/drivers/mfd/glamo/glamo-core.h
@@ -72,6 +72,8 @@ struct glamo_mci_pdata {
 	unsigned long	ocr_avail;
 	void		(*glamo_set_mci_power)(unsigned char power_mode,
 				     unsigned short vdd);
+	/* glamo-mci asking if it should use the slow clock to card */
+	int		(*glamo_mci_use_slow)(void);
 	int		(*glamo_irq_is_wired)(void);
 	void		(*mci_suspending)(struct platform_device *dev);
 	int		(*mci_all_dependencies_resumed)(struct platform_device *dev);
diff --git a/drivers/mfd/glamo/glamo-mci.c b/drivers/mfd/glamo/glamo-mci.c
index 7a2b060..d34632a 100644
--- a/drivers/mfd/glamo/glamo-mci.c
+++ b/drivers/mfd/glamo/glamo-mci.c
@@ -57,6 +57,23 @@ static int sd_max_clk = 50000000 / 3;
 module_param(sd_max_clk, int, 0644);
 
 /*
+ * Slow SD clock rate
+ *
+ * you can override this on kernel commandline using
+ *
+ *   glamo_mci.sd_slow_ratio=8
+ *
+ * for example
+ *
+ * platform callback is used to decide effective clock rate, if not
+ * defined then max is used, if defined and returns nonzero, rate is
+ * divided by this factor
+ */
+
+static int sd_slow_ratio = 8;
+module_param(sd_slow_ratio, int, 0644);
+
+/*
  * SD Signal drive strength
  *
  * you can override this on kernel commandline using
@@ -554,8 +571,17 @@ static void glamo_mci_send_request(struct mmc_host *mmc)
 		 cmd->opcode, cmd->arg, cmd->data, cmd->mrq->stop,
 		 cmd->flags);
 
-	/* resume requested clock rate */
-	__glamo_mci_fix_card_div(host, host->clk_div);
+	/* resume requested clock rate
+	 * scale it down by sd_slow_ratio if platform requests it
+	 */
+	if (host->pdata->glamo_mci_use_slow)
+		if ((host->pdata->glamo_mci_use_slow)())
+			__glamo_mci_fix_card_div(host, host->clk_div *
+								 sd_slow_ratio);
+		else
+			__glamo_mci_fix_card_div(host, host->clk_div);
+	else
+		__glamo_mci_fix_card_div(host, host->clk_div);
 
 	if (glamo_mci_send_command(host, cmd))
 		goto bail;
diff --git a/include/linux/glamofb.h b/include/linux/glamofb.h
index bb1a398..ca63355 100644
--- a/include/linux/glamofb.h
+++ b/include/linux/glamofb.h
@@ -31,6 +31,8 @@ struct glamofb_platform_data {
 	/* glamo mmc platform specific info */
 	void		(*glamo_set_mci_power)(unsigned char power_mode,
 				     unsigned short vdd);
+	/* glamo-mci asking if it should use the slow clock to card */
+	int		(*glamo_mci_use_slow)(void);
 	int		(*glamo_irq_is_wired)(void);
 	void		(*mci_suspending)(struct platform_device *dev);
 	int		(*mci_all_dependencies_resumed)(struct platform_device *dev);
-- 
1.5.6.3