Dear Rolf Offermanns,

In message <4b191b54.6030...@sysgo.com> you wrote:
> 
> does anyone has a working SM501 framebuffer on the STK5200 board? The 
> board itself works fine on the 2.6.32 kernel.

This is a pretty well supported configuration.


> I got a patch from TQ which used to work around 2.6.24 but it seems with 
> the unification of the "simple mpc5200" boards the sm501 support got lost.

Don't expect any real support from TQ on this; so far they never
spent any efforts on the arch/powerpc port of the TQM5200.

> I toyed around with the patch a bit and I got the driver to probe and 
> initialize the chip, but I don't get an output on the crt port and an 
> open() on /dev/fb0 or /dev/fb1 fails with "no device".

Did you check if you eventually have forgotten to enable Framebuffer
console in your kernel configuration? Make sure to set:

 Device Drivers  --->
   Character devices  --->
     [*] Virtual terminal
     [*]   Support for console on virtual terminal (NEW)

   ...
   Multifunction device drivers  ---> 
     <*> Support for Silicon Motion SM501

   ...
   Graphics support  --->
     <*> Support for frame buffer devices  --->
       [*]   Framebuffer foreign endianness support  --->
         Choice endianness support (Support for Big- and Little-Endian 
framebuffers)  --->
       ...
       <*>   Silicon Motion SM501 framebuffer support

     ...
     Console display driver support  --->
       [ ] VGA text console      (! disable VGA text console!)
       <*> Framebuffer Console support


Please find attached below a patch which fixes some issues (but we
don't consider it clean enough for inclusion into mainline yet), and a
known to be working config file. [Kudos to Anatolij for providing
this.]

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: w...@denx.de
What was sliced bread the greatest thing since?

>From e503a4524ac714f0336ab0a7c02f92ae488e4940 Mon Sep 17 00:00:00 2001
From: Anatolij Gustschin <agust@denx.de>
Date: Tue, 7 Oct 2009 14:45:16 +0200
Subject: [PATCH] sm501: support SM501 on TQM5200

Signed-off-by: Anatolij Gustschin <agust@denx.de>
---
 drivers/mfd/sm501.c     |   40 ++++++++++++++++++++++++++++++++++++++++
 drivers/video/sm501fb.c |   12 +++++++++++-
 2 files changed, 51 insertions(+), 1 deletions(-)

diff --git a/drivers/mfd/sm501.c b/drivers/mfd/sm501.c
index 0cc5eef..970fa89 100644
--- a/drivers/mfd/sm501.c
+++ b/drivers/mfd/sm501.c
@@ -27,6 +27,13 @@
 
 #include <asm/io.h>
 
+#if defined(CONFIG_PPC_MPC52xx)
+#undef readl
+#undef writel
+#define readl(addr)		__do_readl_be((addr))
+#define writel(val, addr)	__do_writel_be((val), (addr))
+#endif
+
 struct sm501_device {
 	struct list_head		list;
 	struct platform_device		pdev;
@@ -1378,12 +1385,14 @@ static int __devinit sm501_init_dev(struct sm501_devdata *sm)
 			sm501_register_gpio(sm);
 	}
 
+#if !defined(CONFIG_PPC_MPC52xx) /* prevent crash on tqm5200 */
 	if (pdata->gpio_i2c != NULL && pdata->gpio_i2c_nr > 0) {
 		if (!sm501_gpio_isregistered(sm))
 			dev_err(sm->dev, "no gpio available for i2c gpio.\n");
 		else
 			sm501_register_gpio_i2c(sm, pdata);
 	}
+#endif
 
 	ret = sm501_check_clocks(sm);
 	if (ret) {
@@ -1417,7 +1426,9 @@ static int __devinit sm501_plat_probe(struct platform_device *dev)
 	ret = platform_get_irq(dev, 0);
 	if (ret < 0) {
 		dev_err(&dev->dev, "failed to get irq resource\n");
+#if !defined(CONFIG_PPC_MPC52xx) /* we do not need irq on tqm5200 for fbdev */
 		goto err_res;
+#endif
 	}
 	sm->irq = ret;
 
@@ -1748,8 +1759,37 @@ static struct platform_driver sm501_plat_driver = {
 	.resume		= sm501_plat_resume,
 };
 
+#if defined(CONFIG_PPC_MPC52xx)
+/* define sm501 resources on tqm5200 */
+#define SM501_FB_BASE	0xe0000000
+#define SM501_FB_SIZE	0x00800000
+#define SM501_IO_BASE	0xe3e00000
+#define SM501_IO_SIZE	0x00200000
+#define SM501_FB_END	((SM501_FB_BASE) + (SM501_FB_SIZE) - 1)
+#define SM501_IO_END	((SM501_IO_BASE) + (SM501_IO_SIZE) - 1)
+
+static struct resource sm501_device0_resources[] = {
+	[0] = {.start = SM501_FB_BASE, .end = SM501_FB_END, .flags = IORESOURCE_MEM,},
+	[1] = {.start = SM501_IO_BASE, .end = SM501_IO_END, .flags = IORESOURCE_MEM,},
+};
+
+static struct platform_device sm501_device0 = {
+	.name = "sm501",
+	.id = 0,
+	.num_resources = ARRAY_SIZE(sm501_device0_resources),
+	.resource = sm501_device0_resources,
+};
+
+static struct platform_device *sm501_mfd_devices[] __initdata = {
+	&sm501_device0,
+};
+#endif
+
 static int __init sm501_base_init(void)
 {
+#if defined(CONFIG_PPC_MPC52xx)
+	platform_add_devices(sm501_mfd_devices, ARRAY_SIZE(sm501_mfd_devices));
+#endif
 	platform_driver_register(&sm501_plat_driver);
 	return pci_register_driver(&sm501_pci_driver);
 }
diff --git a/drivers/video/sm501fb.c b/drivers/video/sm501fb.c
index 924d794..6b65ecd 100644
--- a/drivers/video/sm501fb.c
+++ b/drivers/video/sm501fb.c
@@ -43,6 +43,13 @@
 
 #define NR_PALETTE	256
 
+#if defined(CONFIG_PPC_MPC52xx)
+#undef readl
+#undef writel
+#define readl(addr)		__do_readl_be((addr))
+#define writel(val, addr)	__do_writel_be((val), (addr))
+#endif
+
 enum sm501_controller {
 	HEAD_CRT	= 0,
 	HEAD_PANEL	= 1,
@@ -1487,6 +1494,9 @@ static int sm501fb_init_fb(struct fb_info *fb,
 
 	fb->fbops = &par->ops;
 	fb->flags = FBINFO_FLAG_DEFAULT |
+#if defined(CONFIG_PPC_MPC52xx)
+		FBINFO_FOREIGN_ENDIAN |
+#endif
 		FBINFO_HWACCEL_XPAN | FBINFO_HWACCEL_YPAN;
 
 	/* fixed data */
@@ -1519,7 +1529,7 @@ static int sm501fb_init_fb(struct fb_info *fb,
 			fb->var.yres_virtual = fb->var.yres;
 		} else {
 			ret = fb_find_mode(&fb->var, fb,
-					   NULL, NULL, 0, NULL, 8);
+					   "640x480@60", NULL, 0, NULL, 16);
 
 			if (ret == 0 || ret == 4) {
 				dev_err(info->dev,
-- 
1.5.6.3

Attachment: config-tqm5200-sm501.gz
Description: config-tqm5200-sm501.gz

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to