aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJaya Kumar <jayakumar.lkml@gmail.com>2010-03-10 18:21:41 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2010-03-12 18:52:34 -0500
commit2afb18981739a1426af2a6c952e03c5966b3dfc6 (patch)
treefb1feeb9e7882a4810bf9088959e33a1148bc090 /drivers
parente17cea3cece6d3ec47a5b358821505943abe6541 (diff)
broadsheetfb: add MMIO hooks
Allow boards with GP-MMIO controllers to provide hooks to broadsheetfb in order to offload cmd/data writes and data reads instead of relying only on host based GPIO wiggling. Signed-off-by: Jaya Kumar <jayakumar.lkml@gmail.com> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Cc: Krzysztof Helt <krzysztof.h1@wp.pl> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/broadsheetfb.c110
1 files changed, 94 insertions, 16 deletions
diff --git a/drivers/video/broadsheetfb.c b/drivers/video/broadsheetfb.c
index 8f011062dec5..57dc1a0065c2 100644
--- a/drivers/video/broadsheetfb.c
+++ b/drivers/video/broadsheetfb.c
@@ -115,30 +115,30 @@ static struct fb_var_screeninfo broadsheetfb_var __devinitdata = {
115}; 115};
116 116
117/* main broadsheetfb functions */ 117/* main broadsheetfb functions */
118static void broadsheet_issue_data(struct broadsheetfb_par *par, u16 data) 118static void broadsheet_gpio_issue_data(struct broadsheetfb_par *par, u16 data)
119{ 119{
120 par->board->set_ctl(par, BS_WR, 0); 120 par->board->set_ctl(par, BS_WR, 0);
121 par->board->set_hdb(par, data); 121 par->board->set_hdb(par, data);
122 par->board->set_ctl(par, BS_WR, 1); 122 par->board->set_ctl(par, BS_WR, 1);
123} 123}
124 124
125static void broadsheet_issue_cmd(struct broadsheetfb_par *par, u16 data) 125static void broadsheet_gpio_issue_cmd(struct broadsheetfb_par *par, u16 data)
126{ 126{
127 par->board->set_ctl(par, BS_DC, 0); 127 par->board->set_ctl(par, BS_DC, 0);
128 broadsheet_issue_data(par, data); 128 broadsheet_gpio_issue_data(par, data);
129} 129}
130 130
131static void broadsheet_send_command(struct broadsheetfb_par *par, u16 data) 131static void broadsheet_gpio_send_command(struct broadsheetfb_par *par, u16 data)
132{ 132{
133 par->board->wait_for_rdy(par); 133 par->board->wait_for_rdy(par);
134 134
135 par->board->set_ctl(par, BS_CS, 0); 135 par->board->set_ctl(par, BS_CS, 0);
136 broadsheet_issue_cmd(par, data); 136 broadsheet_gpio_issue_cmd(par, data);
137 par->board->set_ctl(par, BS_DC, 1); 137 par->board->set_ctl(par, BS_DC, 1);
138 par->board->set_ctl(par, BS_CS, 1); 138 par->board->set_ctl(par, BS_CS, 1);
139} 139}
140 140
141static void broadsheet_send_cmdargs(struct broadsheetfb_par *par, u16 cmd, 141static void broadsheet_gpio_send_cmdargs(struct broadsheetfb_par *par, u16 cmd,
142 int argc, u16 *argv) 142 int argc, u16 *argv)
143{ 143{
144 int i; 144 int i;
@@ -146,15 +146,43 @@ static void broadsheet_send_cmdargs(struct broadsheetfb_par *par, u16 cmd,
146 par->board->wait_for_rdy(par); 146 par->board->wait_for_rdy(par);
147 147
148 par->board->set_ctl(par, BS_CS, 0); 148 par->board->set_ctl(par, BS_CS, 0);
149 broadsheet_issue_cmd(par, cmd); 149 broadsheet_gpio_issue_cmd(par, cmd);
150 par->board->set_ctl(par, BS_DC, 1); 150 par->board->set_ctl(par, BS_DC, 1);
151 151
152 for (i = 0; i < argc; i++) 152 for (i = 0; i < argc; i++)
153 broadsheet_issue_data(par, argv[i]); 153 broadsheet_gpio_issue_data(par, argv[i]);
154 par->board->set_ctl(par, BS_CS, 1); 154 par->board->set_ctl(par, BS_CS, 1);
155} 155}
156 156
157static void broadsheet_burst_write(struct broadsheetfb_par *par, int size, 157static void broadsheet_mmio_send_cmdargs(struct broadsheetfb_par *par, u16 cmd,
158 int argc, u16 *argv)
159{
160 int i;
161
162 par->board->mmio_write(par, BS_MMIO_CMD, cmd);
163
164 for (i = 0; i < argc; i++)
165 par->board->mmio_write(par, BS_MMIO_DATA, argv[i]);
166}
167
168static void broadsheet_send_command(struct broadsheetfb_par *par, u16 data)
169{
170 if (par->board->mmio_write)
171 par->board->mmio_write(par, BS_MMIO_CMD, data);
172 else
173 broadsheet_gpio_send_command(par, data);
174}
175
176static void broadsheet_send_cmdargs(struct broadsheetfb_par *par, u16 cmd,
177 int argc, u16 *argv)
178{
179 if (par->board->mmio_write)
180 broadsheet_mmio_send_cmdargs(par, cmd, argc, argv);
181 else
182 broadsheet_gpio_send_cmdargs(par, cmd, argc, argv);
183}
184
185static void broadsheet_gpio_burst_write(struct broadsheetfb_par *par, int size,
158 u16 *data) 186 u16 *data)
159{ 187{
160 int i; 188 int i;
@@ -174,7 +202,30 @@ static void broadsheet_burst_write(struct broadsheetfb_par *par, int size,
174 par->board->set_ctl(par, BS_CS, 1); 202 par->board->set_ctl(par, BS_CS, 1);
175} 203}
176 204
177static u16 broadsheet_get_data(struct broadsheetfb_par *par) 205static void broadsheet_mmio_burst_write(struct broadsheetfb_par *par, int size,
206 u16 *data)
207{
208 int i;
209 u16 tmp;
210
211 for (i = 0; i < size; i++) {
212 tmp = (data[i] & 0x0F) << 4;
213 tmp |= (data[i] & 0x0F00) << 4;
214 par->board->mmio_write(par, BS_MMIO_DATA, tmp);
215 }
216
217}
218
219static void broadsheet_burst_write(struct broadsheetfb_par *par, int size,
220 u16 *data)
221{
222 if (par->board->mmio_write)
223 broadsheet_mmio_burst_write(par, size, data);
224 else
225 broadsheet_gpio_burst_write(par, size, data);
226}
227
228static u16 broadsheet_gpio_get_data(struct broadsheetfb_par *par)
178{ 229{
179 u16 res; 230 u16 res;
180 /* wait for ready to go hi. (lo is busy) */ 231 /* wait for ready to go hi. (lo is busy) */
@@ -194,7 +245,16 @@ static u16 broadsheet_get_data(struct broadsheetfb_par *par)
194 return res; 245 return res;
195} 246}
196 247
197static void broadsheet_write_reg(struct broadsheetfb_par *par, u16 reg, 248
249static u16 broadsheet_get_data(struct broadsheetfb_par *par)
250{
251 if (par->board->mmio_read)
252 return par->board->mmio_read(par);
253 else
254 return broadsheet_gpio_get_data(par);
255}
256
257static void broadsheet_gpio_write_reg(struct broadsheetfb_par *par, u16 reg,
198 u16 data) 258 u16 data)
199{ 259{
200 /* wait for ready to go hi. (lo is busy) */ 260 /* wait for ready to go hi. (lo is busy) */
@@ -203,16 +263,34 @@ static void broadsheet_write_reg(struct broadsheetfb_par *par, u16 reg,
203 /* cs lo, dc lo for cmd, we lo for each data, db as usual */ 263 /* cs lo, dc lo for cmd, we lo for each data, db as usual */
204 par->board->set_ctl(par, BS_CS, 0); 264 par->board->set_ctl(par, BS_CS, 0);
205 265
206 broadsheet_issue_cmd(par, BS_CMD_WR_REG); 266 broadsheet_gpio_issue_cmd(par, BS_CMD_WR_REG);
207 267
208 par->board->set_ctl(par, BS_DC, 1); 268 par->board->set_ctl(par, BS_DC, 1);
209 269
210 broadsheet_issue_data(par, reg); 270 broadsheet_gpio_issue_data(par, reg);
211 broadsheet_issue_data(par, data); 271 broadsheet_gpio_issue_data(par, data);
212 272
213 par->board->set_ctl(par, BS_CS, 1); 273 par->board->set_ctl(par, BS_CS, 1);
214} 274}
215 275
276static void broadsheet_mmio_write_reg(struct broadsheetfb_par *par, u16 reg,
277 u16 data)
278{
279 par->board->mmio_write(par, BS_MMIO_CMD, BS_CMD_WR_REG);
280 par->board->mmio_write(par, BS_MMIO_DATA, reg);
281 par->board->mmio_write(par, BS_MMIO_DATA, data);
282
283}
284
285static void broadsheet_write_reg(struct broadsheetfb_par *par, u16 reg,
286 u16 data)
287{
288 if (par->board->mmio_write)
289 broadsheet_mmio_write_reg(par, reg, data);
290 else
291 broadsheet_gpio_write_reg(par, reg, data);
292}
293
216static void broadsheet_write_reg32(struct broadsheetfb_par *par, u16 reg, 294static void broadsheet_write_reg32(struct broadsheetfb_par *par, u16 reg,
217 u32 data) 295 u32 data)
218{ 296{
@@ -223,8 +301,8 @@ static void broadsheet_write_reg32(struct broadsheetfb_par *par, u16 reg,
223 301
224static u16 broadsheet_read_reg(struct broadsheetfb_par *par, u16 reg) 302static u16 broadsheet_read_reg(struct broadsheetfb_par *par, u16 reg)
225{ 303{
226 broadsheet_send_command(par, reg); 304 broadsheet_send_cmdargs(par, BS_CMD_RD_REG, 1, &reg);
227 msleep(100); 305 par->board->wait_for_rdy(par);
228 return broadsheet_get_data(par); 306 return broadsheet_get_data(par);
229} 307}
230 308