Merge: Add support for AMCC 440SPe CPU based eval board (Yucca).
[oweals/u-boot.git] / board / tqm5200 / tqm5200.c
1 /*
2  * (C) Copyright 2003-2004
3  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4  *
5  * (C) Copyright 2004
6  * Mark Jonas, Freescale Semiconductor, mark.jonas@motorola.com.
7  *
8  * (C) Copyright 2004-2005
9  * Martin Krause, TQ-Systems GmbH, martin.krause@tqs.de
10  *
11  * See file CREDITS for list of people who contributed to this
12  * project.
13  *
14  * This program is free software; you can redistribute it and/or
15  * modify it under the terms of the GNU General Public License as
16  * published by the Free Software Foundation; either version 2 of
17  * the License, or (at your option) any later version.
18  *
19  * This program is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  *
24  * You should have received a copy of the GNU General Public License
25  * along with this program; if not, write to the Free Software
26  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
27  * MA 02111-1307 USA
28  */
29
30 #include <common.h>
31 #include <mpc5xxx.h>
32 #include <pci.h>
33
34 #ifdef CONFIG_VIDEO_SM501
35 #include <sm501.h>
36 #endif
37
38 #if defined(CONFIG_MPC5200_DDR)
39 #include "mt46v16m16-75.h"
40 #else
41 #include "mt48lc16m16a2-75.h"
42 #endif
43
44 #ifdef CONFIG_PS2MULT
45 void ps2mult_early_init(void);
46 #endif
47
48 #ifndef CFG_RAMBOOT
49 static void sdram_start (int hi_addr)
50 {
51         long hi_addr_bit = hi_addr ? 0x01000000 : 0;
52
53         /* unlock mode register */
54         *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000000 |
55                 hi_addr_bit;
56         __asm__ volatile ("sync");
57
58         /* precharge all banks */
59         *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000002 |
60                 hi_addr_bit;
61         __asm__ volatile ("sync");
62
63 #if SDRAM_DDR
64         /* set mode register: extended mode */
65         *(vu_long *)MPC5XXX_SDRAM_MODE = SDRAM_EMODE;
66         __asm__ volatile ("sync");
67
68         /* set mode register: reset DLL */
69         *(vu_long *)MPC5XXX_SDRAM_MODE = SDRAM_MODE | 0x04000000;
70         __asm__ volatile ("sync");
71 #endif
72
73         /* precharge all banks */
74         *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000002 |
75                 hi_addr_bit;
76         __asm__ volatile ("sync");
77
78         /* auto refresh */
79         *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000004 |
80                 hi_addr_bit;
81         __asm__ volatile ("sync");
82
83         /* set mode register */
84         *(vu_long *)MPC5XXX_SDRAM_MODE = SDRAM_MODE;
85         __asm__ volatile ("sync");
86
87         /* normal operation */
88         *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | hi_addr_bit;
89         __asm__ volatile ("sync");
90 }
91 #endif
92
93 /*
94  * ATTENTION: Although partially referenced initdram does NOT make real use
95  *            use of CFG_SDRAM_BASE. The code does not work if CFG_SDRAM_BASE
96  *            is something else than 0x00000000.
97  */
98
99 #if defined(CONFIG_MPC5200)
100 long int initdram (int board_type)
101 {
102         ulong dramsize = 0;
103         ulong dramsize2 = 0;
104 #ifndef CFG_RAMBOOT
105         ulong test1, test2;
106
107         /* setup SDRAM chip selects */
108         *(vu_long *)MPC5XXX_SDRAM_CS0CFG = 0x0000001c; /* 512MB at 0x0 */
109         *(vu_long *)MPC5XXX_SDRAM_CS1CFG = 0x40000000; /* disabled */
110         __asm__ volatile ("sync");
111
112         /* setup config registers */
113         *(vu_long *)MPC5XXX_SDRAM_CONFIG1 = SDRAM_CONFIG1;
114         *(vu_long *)MPC5XXX_SDRAM_CONFIG2 = SDRAM_CONFIG2;
115         __asm__ volatile ("sync");
116
117 #if SDRAM_DDR
118         /* set tap delay */
119         *(vu_long *)MPC5XXX_CDM_PORCFG = SDRAM_TAPDELAY;
120         __asm__ volatile ("sync");
121 #endif
122
123         /* find RAM size using SDRAM CS0 only */
124         sdram_start(0);
125         test1 = get_ram_size((long *)CFG_SDRAM_BASE, 0x20000000);
126         sdram_start(1);
127         test2 = get_ram_size((long *)CFG_SDRAM_BASE, 0x20000000);
128         if (test1 > test2) {
129                 sdram_start(0);
130                 dramsize = test1;
131         } else {
132                 dramsize = test2;
133         }
134
135         /* memory smaller than 1MB is impossible */
136         if (dramsize < (1 << 20)) {
137                 dramsize = 0;
138         }
139
140         /* set SDRAM CS0 size according to the amount of RAM found */
141         if (dramsize > 0) {
142                 *(vu_long *)MPC5XXX_SDRAM_CS0CFG = 0x13 +
143                         __builtin_ffs(dramsize >> 20) - 1;
144         } else {
145                 *(vu_long *)MPC5XXX_SDRAM_CS0CFG = 0; /* disabled */
146         }
147
148         /* let SDRAM CS1 start right after CS0 */
149         *(vu_long *)MPC5XXX_SDRAM_CS1CFG = dramsize + 0x0000001c; /* 512MB */
150
151         /* find RAM size using SDRAM CS1 only */
152         sdram_start(0);
153         test1 = get_ram_size((long *)(CFG_SDRAM_BASE + dramsize), 0x20000000);
154         sdram_start(1);
155         test2 = get_ram_size((long *)(CFG_SDRAM_BASE + dramsize), 0x20000000);
156         if (test1 > test2) {
157                 sdram_start(0);
158                 dramsize2 = test1;
159         } else {
160                 dramsize2 = test2;
161         }
162
163         /* memory smaller than 1MB is impossible */
164         if (dramsize2 < (1 << 20)) {
165                 dramsize2 = 0;
166         }
167
168         /* set SDRAM CS1 size according to the amount of RAM found */
169         if (dramsize2 > 0) {
170                 *(vu_long *)MPC5XXX_SDRAM_CS1CFG = dramsize
171                         | (0x13 + __builtin_ffs(dramsize2 >> 20) - 1);
172         } else {
173                 *(vu_long *)MPC5XXX_SDRAM_CS1CFG = dramsize; /* disabled */
174         }
175
176 #else /* CFG_RAMBOOT */
177
178         /* retrieve size of memory connected to SDRAM CS0 */
179         dramsize = *(vu_long *)MPC5XXX_SDRAM_CS0CFG & 0xFF;
180         if (dramsize >= 0x13) {
181                 dramsize = (1 << (dramsize - 0x13)) << 20;
182         } else {
183                 dramsize = 0;
184         }
185
186         /* retrieve size of memory connected to SDRAM CS1 */
187         dramsize2 = *(vu_long *)MPC5XXX_SDRAM_CS1CFG & 0xFF;
188         if (dramsize2 >= 0x13) {
189                 dramsize2 = (1 << (dramsize2 - 0x13)) << 20;
190         } else {
191                 dramsize2 = 0;
192         }
193
194 #endif /* CFG_RAMBOOT */
195
196 /*      return dramsize + dramsize2; */
197         return dramsize;
198 }
199
200 #elif defined(CONFIG_MGT5100)
201
202 long int initdram (int board_type)
203 {
204         ulong dramsize = 0;
205 #ifndef CFG_RAMBOOT
206         ulong test1, test2;
207
208         /* setup and enable SDRAM chip selects */
209         *(vu_long *)MPC5XXX_SDRAM_START = 0x00000000;
210         *(vu_long *)MPC5XXX_SDRAM_STOP = 0x0000ffff;/* 2G */
211         *(vu_long *)MPC5XXX_ADDECR |= (1 << 22); /* Enable SDRAM */
212         __asm__ volatile ("sync");
213
214         /* setup config registers */
215         *(vu_long *)MPC5XXX_SDRAM_CONFIG1 = SDRAM_CONFIG1;
216         *(vu_long *)MPC5XXX_SDRAM_CONFIG2 = SDRAM_CONFIG2;
217
218         /* address select register */
219         *(vu_long *)MPC5XXX_SDRAM_XLBSEL = SDRAM_ADDRSEL;
220         __asm__ volatile ("sync");
221
222         /* find RAM size */
223         sdram_start(0);
224         test1 = get_ram_size((ulong *)CFG_SDRAM_BASE, 0x80000000);
225         sdram_start(1);
226         test2 = get_ram_size((ulong *)CFG_SDRAM_BASE, 0x80000000);
227         if (test1 > test2) {
228                 sdram_start(0);
229                 dramsize = test1;
230         } else {
231                 dramsize = test2;
232         }
233
234         /* set SDRAM end address according to size */
235         *(vu_long *)MPC5XXX_SDRAM_STOP = ((dramsize - 1) >> 15);
236
237 #else /* CFG_RAMBOOT */
238
239         /* Retrieve amount of SDRAM available */
240         dramsize = ((*(vu_long *)MPC5XXX_SDRAM_STOP + 1) << 15);
241
242 #endif /* CFG_RAMBOOT */
243
244         return dramsize;
245 }
246
247 #else
248 #error Neither CONFIG_MPC5200 or CONFIG_MGT5100 defined
249 #endif
250
251 int checkboard (void)
252 {
253 #if defined (CONFIG_AEVFIFO)
254         puts ("Board: AEVFIFO\n");
255         return 0;
256 #endif
257 #if defined (CONFIG_TQM5200)
258         puts ("Board: TQM5200 (TQ-Components GmbH)\n");
259 #endif
260 #if defined (CONFIG_STK52XX)
261         puts ("       on a STK52XX baseboard\n");
262 #endif
263
264         return 0;
265 }
266
267 void flash_preinit(void)
268 {
269         /*
270          * Now, when we are in RAM, enable flash write
271          * access for detection process.
272          * Note that CS_BOOT cannot be cleared when
273          * executing in flash.
274          */
275 #if defined(CONFIG_MGT5100)
276         *(vu_long *)MPC5XXX_ADDECR &= ~(1 << 25); /* disable CS_BOOT */
277         *(vu_long *)MPC5XXX_ADDECR |= (1 << 16); /* enable CS0 */
278 #endif
279         *(vu_long *)MPC5XXX_BOOTCS_CFG &= ~0x1; /* clear RO */
280 }
281
282
283 #ifdef  CONFIG_PCI
284 static struct pci_controller hose;
285
286 extern void pci_mpc5xxx_init(struct pci_controller *);
287
288 void pci_init_board(void)
289 {
290         pci_mpc5xxx_init(&hose);
291 }
292 #endif
293
294 #if defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET)
295
296 #if defined (CONFIG_MINIFAP)
297 #define SM501_POWER_MODE0_GATE          0x00000040UL
298 #define SM501_POWER_MODE1_GATE          0x00000048UL
299 #define POWER_MODE_GATE_GPIO_PWM_I2C    0x00000040UL
300 #define SM501_GPIO_DATA_DIR_HIGH        0x0001000CUL
301 #define SM501_GPIO_DATA_HIGH            0x00010004UL
302 #define SM501_GPIO_51                   0x00080000UL
303 #else
304 #define GPIO_PSC1_4     0x01000000UL
305 #endif
306
307 void init_ide_reset (void)
308 {
309         debug ("init_ide_reset\n");
310
311 #if defined (CONFIG_MINIFAP)
312         /* Configure GPIO_51 of the SM501 grafic controller as ATA reset */
313
314         /* enable GPIO control (in both power modes) */
315         *(vu_long *) (SM501_MMIO_BASE+SM501_POWER_MODE0_GATE) |=
316                 POWER_MODE_GATE_GPIO_PWM_I2C;
317         *(vu_long *) (SM501_MMIO_BASE+SM501_POWER_MODE1_GATE) |=
318                 POWER_MODE_GATE_GPIO_PWM_I2C;
319         /* configure GPIO51 as output */
320         *(vu_long *) (SM501_MMIO_BASE+SM501_GPIO_DATA_DIR_HIGH) |=
321                 SM501_GPIO_51;
322 #else
323         /* Configure PSC1_4 as GPIO output for ATA reset */
324         *(vu_long *) MPC5XXX_WU_GPIO_ENABLE |= GPIO_PSC1_4;
325         *(vu_long *) MPC5XXX_WU_GPIO_DIR    |= GPIO_PSC1_4;
326 #endif
327 }
328
329 void ide_set_reset (int idereset)
330 {
331         debug ("ide_reset(%d)\n", idereset);
332
333 #if defined (CONFIG_MINIFAP)
334         if (idereset) {
335                 *(vu_long *) (SM501_MMIO_BASE+SM501_GPIO_DATA_HIGH) &=
336                         ~SM501_GPIO_51;
337         } else {
338                 *(vu_long *) (SM501_MMIO_BASE+SM501_GPIO_DATA_HIGH) |=
339                         SM501_GPIO_51;
340         }
341 #else
342         if (idereset) {
343                 *(vu_long *) MPC5XXX_WU_GPIO_DATA &= ~GPIO_PSC1_4;
344         } else {
345                 *(vu_long *) MPC5XXX_WU_GPIO_DATA |=  GPIO_PSC1_4;
346         }
347 #endif
348 }
349 #endif /* defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) */
350
351 #ifdef CONFIG_POST
352 /*
353  * Reads GPIO pin PSC6_3. A keypress is reported, if PSC6_3 is low. If PSC6_3
354  * is left open, no keypress is detected.
355  */
356 int post_hotkeys_pressed(void)
357 {
358         struct mpc5xxx_gpio *gpio;
359
360         gpio = (struct mpc5xxx_gpio*) MPC5XXX_GPIO;
361
362         /*
363          * Configure PSC6_1 and PSC6_3 as GPIO. PSC6 then couldn't be used in
364          * CODEC or UART mode. Consumer IrDA should still be possible.
365          */
366         gpio->port_config &= ~(0x07000000);
367         gpio->port_config |=   0x03000000;
368
369         /* Enable GPIO for GPIO_IRDA_1 (IR_USB_CLK pin) = PSC6_3 */
370         gpio->simple_gpioe |= 0x20000000;
371
372         /* Configure GPIO_IRDA_1 as input */
373         gpio->simple_ddr &= ~(0x20000000);
374
375         return ((gpio->simple_ival & 0x20000000) ? 0 : 1);
376 }
377 #endif
378
379 #if defined(CONFIG_POST) || defined(CONFIG_LOGBUFFER)
380
381 void post_word_store (ulong a)
382 {
383         volatile ulong *save_addr =
384                 (volatile ulong *)(MPC5XXX_SRAM + MPC5XXX_SRAM_POST_SIZE);
385
386         *save_addr = a;
387 }
388
389 ulong post_word_load (void)
390 {
391         volatile ulong *save_addr =
392                 (volatile ulong *)(MPC5XXX_SRAM + MPC5XXX_SRAM_POST_SIZE);
393
394         return *save_addr;
395 }
396 #endif  /* CONFIG_POST || CONFIG_LOGBUFFER*/
397
398 #ifdef CONFIG_PS2MULT
399 #ifdef CONFIG_BOARD_EARLY_INIT_R
400 int board_early_init_r (void)
401 {
402         ps2mult_early_init();
403         return (0);
404 }
405 #endif
406 #endif /* CONFIG_PS2MULT */
407
408 #if defined(CONFIG_CS_AUTOCONF)
409 int last_stage_init (void)
410 {
411         /*
412          * auto scan for really existing devices and re-set chip select
413          * configuration.
414          */
415         u16 save, tmp;
416         int restore;
417
418         /*
419          * Check for SRAM and SRAM size
420          */
421
422         /* save original SRAM content  */
423         save = *(volatile u16 *)CFG_CS2_START;
424         restore = 1;
425
426         /* write test pattern to SRAM */
427         *(volatile u16 *)CFG_CS2_START = 0xA5A5;
428         __asm__ volatile ("sync");
429         /*
430          * Put a different pattern on the data lines: otherwise they may float
431          * long enough to read back what we wrote.
432          */
433         tmp = *(volatile u16 *)CFG_FLASH_BASE;
434         if (tmp == 0xA5A5)
435                 puts ("!! possible error in SRAM detection\n");
436
437         if (*(volatile u16 *)CFG_CS2_START != 0xA5A5) {
438                 /* no SRAM at all, disable cs */
439                 *(vu_long *)MPC5XXX_ADDECR &= ~(1 << 18);
440                 *(vu_long *)MPC5XXX_CS2_START = 0x0000FFFF;
441                 *(vu_long *)MPC5XXX_CS2_STOP = 0x0000FFFF;
442                 restore = 0;
443                 __asm__ volatile ("sync");
444         } else if (*(volatile u16 *)(CFG_CS2_START + (1<<19)) == 0xA5A5) {
445                 /* make sure that we access a mirrored address */
446                 *(volatile u16 *)CFG_CS2_START = 0x1111;
447                 __asm__ volatile ("sync");
448                 if (*(volatile u16 *)(CFG_CS2_START + (1<<19)) == 0x1111) {
449                         /* SRAM size = 512 kByte */
450                         *(vu_long *)MPC5XXX_CS2_STOP = STOP_REG(CFG_CS2_START,
451                                                                 0x80000);
452                         __asm__ volatile ("sync");
453                         puts ("SRAM:  512 kB\n");
454                 }
455                 else
456                         puts ("!! possible error in SRAM detection\n");
457         } else {
458                 puts ("SRAM:  1 MB\n");
459         }
460         /* restore origianl SRAM content  */
461         if (restore) {
462                 *(volatile u16 *)CFG_CS2_START = save;
463                 __asm__ volatile ("sync");
464         }
465
466         /*
467          * Check for Grafic Controller
468          */
469
470         /* save origianl FB content  */
471         save = *(volatile u16 *)CFG_CS1_START;
472         restore = 1;
473
474         /* write test pattern to FB memory */
475         *(volatile u16 *)CFG_CS1_START = 0xA5A5;
476         __asm__ volatile ("sync");
477         /*
478          * Put a different pattern on the data lines: otherwise they may float
479          * long enough to read back what we wrote.
480          */
481         tmp = *(volatile u16 *)CFG_FLASH_BASE;
482         if (tmp == 0xA5A5)
483                 puts ("!! possible error in grafic controller detection\n");
484
485         if (*(volatile u16 *)CFG_CS1_START != 0xA5A5) {
486                 /* no grafic controller at all, disable cs */
487                 *(vu_long *)MPC5XXX_ADDECR &= ~(1 << 17);
488                 *(vu_long *)MPC5XXX_CS1_START = 0x0000FFFF;
489                 *(vu_long *)MPC5XXX_CS1_STOP = 0x0000FFFF;
490                 restore = 0;
491                 __asm__ volatile ("sync");
492         } else {
493                 puts ("VGA:   SMI501 (Voyager) with 8 MB\n");
494         }
495         /* restore origianl FB content  */
496         if (restore) {
497                 *(volatile u16 *)CFG_CS1_START = save;
498                 __asm__ volatile ("sync");
499         }
500
501         return 0;
502 }
503 #endif /* CONFIG_CS_AUTOCONF */
504
505 #ifdef CONFIG_VIDEO_SM501
506
507 #define DISPLAY_WIDTH   640
508 #define DISPLAY_HEIGHT  480
509
510 #ifdef CONFIG_VIDEO_SM501_8BPP
511 #error CONFIG_VIDEO_SM501_8BPP not supported.
512 #endif /* CONFIG_VIDEO_SM501_8BPP */
513
514 #ifdef CONFIG_VIDEO_SM501_16BPP
515 #error CONFIG_VIDEO_SM501_16BPP not supported.
516 #endif /* CONFIG_VIDEO_SM501_16BPP */
517 #ifdef CONFIG_VIDEO_SM501_32BPP
518 static const SMI_REGS init_regs [] =
519 {
520 #if 0 /* CRT only */
521         {0x00004, 0x0},
522         {0x00048, 0x00021807},
523         {0x0004C, 0x10090a01},
524         {0x00054, 0x1},
525         {0x00040, 0x00021807},
526         {0x00044, 0x10090a01},
527         {0x00054, 0x0},
528         {0x80200, 0x00010000},
529         {0x80204, 0x0},
530         {0x80208, 0x0A000A00},
531         {0x8020C, 0x02fa027f},
532         {0x80210, 0x004a028b},
533         {0x80214, 0x020c01df},
534         {0x80218, 0x000201e9},
535         {0x80200, 0x00013306},
536 #else  /* panel + CRT */
537         {0x00004, 0x0},
538         {0x00048, 0x00021807},
539         {0x0004C, 0x091a0a01},
540         {0x00054, 0x1},
541         {0x00040, 0x00021807},
542         {0x00044, 0x091a0a01},
543         {0x00054, 0x0},
544         {0x80000, 0x0f013106},
545         {0x80004, 0xc428bb17},
546         {0x8000C, 0x00000000},
547         {0x80010, 0x0a000a00},
548         {0x80014, 0x02800000},
549         {0x80018, 0x01e00000},
550         {0x8001C, 0x00000000},
551         {0x80020, 0x01e00280},
552         {0x80024, 0x02fa027f},
553         {0x80028, 0x004a028b},
554         {0x8002C, 0x020c01df},
555         {0x80030, 0x000201e9},
556         {0x80200, 0x00010000},
557 #endif
558         {0, 0}
559 };
560 #endif /* CONFIG_VIDEO_SM501_32BPP */
561
562 #ifdef CONFIG_CONSOLE_EXTRA_INFO
563 /*
564  * Return text to be printed besides the logo.
565  */
566 void video_get_info_str (int line_number, char *info)
567 {
568         if (line_number == 1) {
569         strcpy (info, " Board: TQM5200 (TQ-Components GmbH)");
570 #if defined (CONFIG_STK52XX)
571         } else if (line_number == 2) {
572                 strcpy (info, "        on a STK52XX baseboard");
573 #endif
574         }
575         else {
576                 info [0] = '\0';
577         }
578 }
579 #endif
580
581 /*
582  * Returns SM501 register base address. First thing called in the
583  * driver. Checks if SM501 is physically present.
584  */
585 unsigned int board_video_init (void)
586 {
587         u16 save, tmp;
588         int restore, ret;
589
590         /*
591          * Check for Grafic Controller
592          */
593
594         /* save origianl FB content  */
595         save = *(volatile u16 *)CFG_CS1_START;
596         restore = 1;
597
598         /* write test pattern to FB memory */
599         *(volatile u16 *)CFG_CS1_START = 0xA5A5;
600         __asm__ volatile ("sync");
601         /*
602          * Put a different pattern on the data lines: otherwise they may float
603          * long enough to read back what we wrote.
604          */
605         tmp = *(volatile u16 *)CFG_FLASH_BASE;
606         if (tmp == 0xA5A5)
607                 puts ("!! possible error in grafic controller detection\n");
608
609         if (*(volatile u16 *)CFG_CS1_START != 0xA5A5) {
610                 /* no grafic controller found */
611                 restore = 0;
612                 ret = 0;
613         } else {
614                 ret = SM501_MMIO_BASE;
615         }
616
617         if (restore) {
618                 *(volatile u16 *)CFG_CS1_START = save;
619                 __asm__ volatile ("sync");
620         }
621         return ret;
622 }
623
624 /*
625  * Returns SM501 framebuffer address
626  */
627 unsigned int board_video_get_fb (void)
628 {
629         return SM501_FB_BASE;
630 }
631
632 /*
633  * Called after initializing the SM501 and before clearing the screen.
634  */
635 void board_validate_screen (unsigned int base)
636 {
637 }
638
639 /*
640  * Return a pointer to the initialization sequence.
641  */
642 const SMI_REGS *board_get_regs (void)
643 {
644         return init_regs;
645 }
646
647 int board_get_width (void)
648 {
649         return DISPLAY_WIDTH;
650 }
651
652 int board_get_height (void)
653 {
654         return DISPLAY_HEIGHT;
655 }
656
657 #endif /* CONFIG_VIDEO_SM501 */