TQM5200 2.6-denx SM501 voyager enabling problem.

Pedro Luis D. L. carcadiz at hotmail.com
Sat Mar 8 01:10:07 EST 2008



Anatolij wrote:

> Hello,

Hello Anatoli,

> Pedro Luis D. L. wrote:
> 
> 
> 
>> I tried to contact TQ but they seem not to be able to solve my
>> problem. They suggested that the problem could be in the different
>> endianness used by MPC5200 and SMI501. That problem seems to be
>> corrected in the driver. Anyway, this endianness problem may come
>> to light if I had any video output. It is possible to change the
>> endianness of SM501 chip from the u-boot writing a register.
>> I did it and it made no difference at all. The real problem is
>> still that none device is initialized or detected even when the
>> Framebuffer driver for SM501 and MFD Driver for SM501 are compiled
>> with the kernel. I checked that platform driver for both are
>> registered (using some printk output) but their probe functions
>> are never invoked.
>> 
>> I thought that my problem could be that I don't have initialized
>> the device within the platform file tqm5200.c. I added the following
>> code (marked with +) to this file under arch/powerpc/platforms/52xx/tqm5200.c
>> 
>> +static struct resource sm501_resources[] = {
>> +	[0]	= {
>> +		.start	= 0xE3E00000,
>> +		.end	= 0xE3DFFFFF,
> 
> This is wrong as '.end' resource should be greater than '.start'.
> The value for '.end' seems to origin from the typo in TQ docs for
> TQM5200. The proper value results from adding 2MB register space
> of the SM501 to the IO base 0xe3e00000 and is 0xe3ffffff.
> Furthermore you didn't define any framebuffer memory resource
> which is strictly needed here for the framebuffer driver.

Yes, I supposed I had to add another resource, but I was not sure how to point them. I didn't realize the documentation error, ups, but it is true, e3d is smaller than e3E... My mistake, sorry :-(


>> +		.flags	= IORESOURCE_MEM,
>> +	},
>> +};
>> +
>> +static struct platform_device sm501_device = {
>> +	.name		= "sm501",
>> +	.id		= 0,
>> +	.num_resources	= ARRAY_SIZE(sm501_resources),
>> +	.resource	= sm501_resources,
>> +};
>> 
>> static void __init tqm5200_setup_arch(void)
>> {
>> 	if (ppc_md.progress)
>> 		ppc_md.progress("tqm5200_setup_arch()", 0);
>> 
>> 	/* Some mpc5200 & mpc5200b related configuration */
>> 	mpc5200_setup_xlb_arbiter();
>> 
>> 	/* Map wdt for mpc52xx_restart() */
>> 	mpc52xx_map_wdt();
>> 
>> #ifdef CONFIG_PCI
>> 	np = of_find_node_by_type(NULL, "pci");
>> 	if (np) {
>> 		mpc52xx_add_bridge(np);
>> 		of_node_put(np);
>> 	}
>> #endif
>> +
>> +	platform_device_register(&sm501_device);
>> +
>> }
>> 
>> I got this idea from the configuration files from other platforms,
>> but I still need to find out how exactly "resources" must be defined.
>> Anybody knows wheather am I pointing in the right direction and this
>> makes any sense?
> 
> yes, the direction is right or this is at least a possible solution
> among others provided that you do it correctly.
> Calling "platform_device_register(...)" from "tqm5200_setup_arch()"
> won't work, so move this call and the resource definitions to
> sm501 platform driver. A really right direction would be adding
> sm501 resource description to the device tree and adding appropriate
> code to the sm501 platform driver, but it is more effort.

I thought about this possible solution (adding resource description to device tree), but as far as I understood, the device tree was intended to describe the microcontroller peripherals and tqm5200, based on the mpc5200 is sold out also without sm501, so that's why I discarded this option.

>> As far as I understand now (and I may be terribly wrong), once
>> that SM501 MFD and Framebuffer drivers are registered,  I need
>> to tell the kernel where to find the device in the local bus.
>> Is it right?
> 
> yes, try the patch below, and also ensure that
> CONFIG_VT,
> CONFIG_VT_CONSOLE,
> CONFIG_FRAMEBUFFER_CONSOLE
> are enabled in the kernel configuration.
> 
> diff --git a/drivers/mfd/sm501.c b/drivers/mfd/sm501.c
> index afd8296..599ffe6 100644
> --- a/drivers/mfd/sm501.c
> +++ b/drivers/mfd/sm501.c
> @@ -901,6 +901,9 @@ static int sm501_init_dev(struct sm501_devdata *sm)
>  
>  	INIT_LIST_HEAD(&sm->devices);
>  
> +	/* switch to BE */
> +	writel(0xffffffff, sm->regs + SM501_ENDIAN_CONTROL);
> +
>  	devid = readl(sm->regs + SM501_DEVICEID);
>  
>  	if ((devid & SM501_DEVICEID_IDMASK) != SM501_DEVICEID_SM501) {
> @@ -1263,8 +1266,31 @@ static struct platform_driver sm501_plat_drv = {
>  	.resume		= sm501_plat_resume,
>  };
>  
> +/* define some sm501 resources on tqm5200 */
> +#define SM501_FB_BASE	0xe0000000
> +#define SM501_IO_BASE	0xe3e00000
> +#define SM501_FB_END	((SM501_FB_BASE) + 0x7fffff)
> +#define SM501_IO_END	((SM501_IO_BASE) + 0x1fffff)
> +
> +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 *mfd_devices[] __initdata = {
> +	&sm501_device0,
> +};
> +
>  static int __init sm501_base_init(void)
>  {
> +	platform_add_devices(mfd_devices, ARRAY_SIZE(mfd_devices));
>  	platform_driver_register(&sm501_plat_drv);
>  	return pci_register_driver(&sm501_pci_drv);
>  }
> 
> Best regards,
> Anatolij

It worked!! Thank you very much. The device is added and I can get some output throught the LCD attached. Although the output is not correct yet (looks like static noise :-) ), but I think it could be because of an incorrect clocks and registers initialization. I should check it up right now.

I think this patch might be include within the kernel. Maybe like a configuration option just in case that SM501 is attached to the tqm. I don't know how to do it but I'll give it a try and submit a patch to denx once I have a proper output when I figure out how.

Thank you very much,

Pedro L.

> -- 
> DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: +49-8142-66989-0 Fax: +49-8142-66989-80  Email: office at denx.de

_________________________________________________________________
La vida de los famosos al desnudo en MSN Entretenimiento
http://entretenimiento.es.msn.com/


More information about the Linuxppc-embedded mailing list