Skip to contentSkip to conversation

video: Add new driver for Silicon Motion SM501/SM502 Part 1/2

PATCH New Stefan Althoefer 4 participants 11 messages Dec 4, 2008 – Dec 8, 2008 Framebuffer layer

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 video: Add new driver for Silicon Motion SM501/SM502 Part 1/2

[PATCH] video: Add new driver for Silicon Motion SM501/SM502

This patch adds a new driver for SM501/SM502. Compared to the existing driver it allows dynamic selection of resolution (environment: videomode).

The drive is based on Vincent Sanders and Ben Dooks' linux kernel driver.

Use CONFIG_VIDEO_SM501NEW to enable the driver.

This has been tested on Janz emPC-A400. On this platform the SM501 is connected via PCI.

The patch is against "latest" u-boot git-repository

Please (still) be patient if style of submission or patches are offending.

----

drivers/video/sm501new.h renamed from /drivers/video/sm501new.h +125 -0
diff -uprN u-boot-orig//drivers/video/sm501new.h u-boot/drivers/video/sm501new.h
@@ -0,0 +1,125 @@
+/* Large parts of this have been taken from the linux kernel source code
+ * with the following licencse:
+ *
+ * Copyright (c) 2006 Simtec Electronics
+ *      Vincent Sanders <[email protected]>
+ *      Ben Dooks <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Framebuffer driver for the Silicon Motion SM501
+ */
+
+/* Ported to u-boot:
+ * 
+ * Copyright (c) 2008 StefanAlthoefer (as at janz.de)
+ */
+
+/*
+ * Platform data definitions 
+ */
+
+#define SM501FB_FLAG_USE_INIT_MODE	(1<<0)
+#define SM501FB_FLAG_DISABLE_AT_EXIT	(1<<1)
+#define SM501FB_FLAG_USE_HWCURSOR	(1<<2)
+#define SM501FB_FLAG_USE_HWACCEL	(1<<3)
+
+struct sm501_platdata_fbsub {
+	struct fb_videomode	*def_mode;
+	unsigned int		 def_bpp;
+	unsigned long		 max_mem;
+	unsigned int		 flags;
+};
+
+enum sm501_fb_routing {
+	SM501_FB_OWN		= 0,	/* CRT=>CRT, Panel=>Panel */
+	SM501_FB_CRT_PANEL	= 1,	/* Panel=>CRT, Panel=>Panel */
+};
+
+/* sm501_platdata_fb flag field bit definitions */
+
+#define SM501_FBPD_SWAP_FB_ENDIAN	(1<<0)	/* need to endian swap */
+
+/* sm501_platdata_fb
+ *
+ * configuration data for the framebuffer driver
+*/
+
+struct sm501_platdata_fb {
+	enum sm501_fb_routing		 fb_route;
+	unsigned int			 flags;
+	struct sm501_platdata_fbsub	*fb_crt;
+	struct sm501_platdata_fbsub	*fb_pnl;
+};
+
+/* gpio i2c */
+
+struct sm501_platdata_gpio_i2c {
+	unsigned int		pin_sda;
+	unsigned int		pin_scl;
+};
+
+/* sm501_initdata
+ *
+ * use for initialising values that may not have been setup
+ * before the driver is loaded.
+*/
+
+struct sm501_reg_init {
+	unsigned long		set;
+	unsigned long		mask;
+};
+
+#define SM501_USE_USB_HOST	(1<<0)
+#define SM501_USE_USB_SLAVE	(1<<1)
+#define SM501_USE_SSP0		(1<<2)
+#define SM501_USE_SSP1		(1<<3)
+#define SM501_USE_UART0		(1<<4)
+#define SM501_USE_UART1		(1<<5)
+#define SM501_USE_FBACCEL	(1<<6)
+#define SM501_USE_AC97		(1<<7)
+#define SM501_USE_I2S		(1<<8)
+
+#define SM501_USE_ALL		(0xffffffff)
+
+struct sm501_initdata {
+	struct sm501_reg_init	gpio_low;
+	struct sm501_reg_init	gpio_high;
+	struct sm501_reg_init	misc_timing;
+	struct sm501_reg_init	misc_control;
+
+	unsigned long		devices;
+	unsigned long		mclk;		/* non-zero to modify */
+	unsigned long		m1xclk;		/* non-zero to modify */
+};
+
+/* sm501_init_gpio
+ *
+ * default gpio settings
+*/
+
+struct sm501_init_gpio {
+	struct sm501_reg_init	gpio_data_low;
+	struct sm501_reg_init	gpio_data_high;
+	struct sm501_reg_init	gpio_ddr_low;
+	struct sm501_reg_init	gpio_ddr_high;
+};
+
+/* sm501_platdata
+ *
+ * This is passed with the platform device to allow the board
+ * to control the behaviour of the SM501 driver(s) which attach
+ * to the device.
+ *
+*/
+
+struct sm501_platdata {
+	struct sm501_initdata		*init;
+	struct sm501_init_gpio		*init_gpiop;
+	struct sm501_platdata_fb	*fb;
+
+	struct sm501_platdata_gpio_i2c	*gpio_i2c;
+	unsigned int			 gpio_i2c_nr;
+};
drivers/video/sm501new-regs.h renamed from /drivers/video/sm501new-regs.h +365 -0

365 lines not on this page · raw message

#1 lore raw

PATCH 1/1 video: Add new driver for Silicon Motion SM501/SM502 Part 1/2

Hello Stefan,

please see comments below:

Quoted 1 line · Stefan Althoefer

[PATCH] video: Add new driver for Silicon Motion SM501/SM502

this line duplicates the subject, so simply remove it.

Quoted 6 lines

This patch adds a new driver for SM501/SM502. Compared to the existing driver it allows dynamic selection of resolution (environment: videomode).

The drive is based on Vincent Sanders and Ben Dooks' linux kernel driver.

s/drive/driver/

Quoted 1 line

Use CONFIG_VIDEO_SM501NEW to enable the driver.

not sure if CONFIG_VIDEO_SM501NEW is a good chose here. Maybe we should use s.th. like CONFIG_VIDEO_SM50x. This applies to the file names too: sm50x.h, sm50x.c, etc. Even better would be a merge with the existing driver.

<snip>

Quoted 4 lines

The patch is against "latest" u-boot git-repository

Please (still) be patient if style of submission or patches are offending.

These lines are patch comments which should not appear in the commit message. The common practice is to place such comments below "---" line.

Quoted 2 lines

----

So, here is the place for patch comments which should not appear in the commit message. Also changes between patch revisions are often summarised here.

drivers/video/sm501new.h line 2

Quoted 6 lines

diff -uprN u-boot-orig//drivers/video/sm501new.h u-boot/drivers/video/sm501new.h

drivers/video/sm501new.h renamed from /drivers/video/sm501new.h +2 -0
@@ -0,0 +1,125 @@
+/* Large parts of this have been taken from the linux kernel source code
+ * with the following licencse:

Multi-line comment style is as follows:
/*
* This is a
* multi-line
* comment
*/

drivers/video/sm501new.h line 18

Quoted 4 lines
drivers/video/sm501new.h renamed from /drivers/video/sm501new.h +4 -0
+/* Ported to u-boot:
+ * 
+ * Copyright (c) 2008 StefanAlthoefer (as at janz.de)
+ */

same here, fix multi-line comment here and everywhere in the code.

<snip>

Quoted 29 lines
drivers/video/sm501new.h renamed from /drivers/video/sm501new.h +29 -0
+#define SM501FB_FLAG_USE_INIT_MODE	(1<<0)
+#define SM501FB_FLAG_DISABLE_AT_EXIT	(1<<1)
+#define SM501FB_FLAG_USE_HWCURSOR	(1<<2)
+#define SM501FB_FLAG_USE_HWACCEL	(1<<3)
+
+struct sm501_platdata_fbsub {
+	struct fb_videomode	*def_mode;
+	unsigned int		 def_bpp;
+	unsigned long		 max_mem;
+	unsigned int		 flags;
+};
+
+enum sm501_fb_routing {
+	SM501_FB_OWN		= 0,	/* CRT=>CRT, Panel=>Panel */
+	SM501_FB_CRT_PANEL	= 1,	/* Panel=>CRT, Panel=>Panel */
+};
+
+/* sm501_platdata_fb flag field bit definitions */
+
+#define SM501_FBPD_SWAP_FB_ENDIAN	(1<<0)	/* need to endian swap */
+
+/* sm501_platdata_fb
+ *
+ * configuration data for the framebuffer driver
+*/
+
+struct sm501_platdata_fb {
+	enum sm501_fb_routing		 fb_route;
+	unsigned int			 flags;

drivers/video/sm501new.h line 62

Quoted 10 lines
drivers/video/sm501new.h renamed from /drivers/video/sm501new.h +10 -0
+	struct sm501_platdata_fbsub	*fb_crt;
+	struct sm501_platdata_fbsub	*fb_pnl;
+};
+
+/* gpio i2c */
+
+struct sm501_platdata_gpio_i2c {
+	unsigned int		pin_sda;
+	unsigned int		pin_scl;
+};

all this stuff above starting from
"#define SM501FB_FLAG_USE_INIT_MODE"
can be removed if you remove "init_gpiop", "fb", "gpio_i2c" and "gpio_i2c_nr" from the "struct sm501_platdata" definition below. Also remove ".fb = &sm501_fb_pdata" from "sm501_pci_platdata" declaration in drivers/video/sm501new.c. These structure members aren't referenced in this U-Boot driver, so they aren't needed (unused and nearly dead code and data).

<snip>

drivers/video/sm501new.h line 83

Quoted 9 lines
drivers/video/sm501new.h renamed from /drivers/video/sm501new.h +9 -0
+#define SM501_USE_USB_HOST	(1<<0)
+#define SM501_USE_USB_SLAVE	(1<<1)
+#define SM501_USE_SSP0		(1<<2)
+#define SM501_USE_SSP1		(1<<3)
+#define SM501_USE_UART0		(1<<4)
+#define SM501_USE_UART1		(1<<5)
+#define SM501_USE_FBACCEL	(1<<6)
+#define SM501_USE_AC97		(1<<7)
+#define SM501_USE_I2S		(1<<8)

These macros aren't used, remove them too.

drivers/video/sm501new.h line 93

Quoted 10 lines
drivers/video/sm501new.h renamed from /drivers/video/sm501new.h +10 -0
+
+#define SM501_USE_ALL		(0xffffffff)
+
+struct sm501_initdata {
+	struct sm501_reg_init	gpio_low;
+	struct sm501_reg_init	gpio_high;
+	struct sm501_reg_init	misc_timing;
+	struct sm501_reg_init	misc_control;
+
+	unsigned long		devices;

"devices" member is only initialized in "sm501_pci_initdata" declaration and isn't referenced anywhere in the code, so another candidate to remove.

Quoted 5 lines
drivers/video/sm501new.h renamed from /drivers/video/sm501new.h +5 -0
+/* sm501_platdata
+ *
+ * This is passed with the platform device to allow the board
+ * to control the behaviour of the SM501 driver(s) which attach
+ * to the device.

drivers/video/sm501new.h line 124

Quoted 10 lines
drivers/video/sm501new.h renamed from /drivers/video/sm501new.h +10 -0
+ *
+*/
+
+struct sm501_platdata {
+	struct sm501_initdata		*init;
+	struct sm501_init_gpio		*init_gpiop;
+	struct sm501_platdata_fb	*fb;
+
+	struct sm501_platdata_gpio_i2c	*gpio_i2c;
+	unsigned int			 gpio_i2c_nr;

see above suggestion to remove init_gpiop, fb, gpio_i2c and gpio_i2c_nr.

Quoted 4 lines

diff -uprN u-boot-orig//drivers/video/sm501new-regs.h u-boot/drivers/video/sm501new-regs.h

drivers/video/sm501new-regs.h line 10

Quoted 10 lines
drivers/video/sm501new-regs.h renamed from /drivers/video/sm501new-regs.h +10 -0
@@ -0,0 +1,365 @@
+/* sm501-regs.h
+ *
+ * Copyright 2006 Simtec Electronics
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Silicon Motion SM501 register definitions
+*/

please, fix multi-line comment style.

Also check all below defined macros in this file. If some macro isn't used in the driver code, then remove it.

drivers/video/sm501new-regs.h line 24

Quoted 13 lines
drivers/video/sm501new-regs.h renamed from /drivers/video/sm501new-regs.h +13 -0
+/* System Configuration area */
+/* System config base */
+#define SM501_SYS_CONFIG		(0x000000)
+
+/* config 1 */
+#define SM501_SYSTEM_CONTROL 		(0x000000)
+#define SM501_MISC_CONTROL		(0x000004)
+
+#define SM501_MISC_BUS_SH		(0x0)
+#define SM501_MISC_BUS_PCI		(0x1)
+#define SM501_MISC_BUS_XSCALE		(0x2)
+#define SM501_MISC_BUS_NEC		(0x6)
+#define SM501_MISC_BUS_MASK		(0x7)

<snip>

Best regards,
Anatolij

Signature · 3 lines
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
#2 lore raw

PATCH 1/1 video: Add new driver for Silicon Motion SM501/SM502 Part 1/2

Hi Anatolij,

<snip>

Quoted 6 lines
Quoted 1 line

Use CONFIG_VIDEO_SM501NEW to enable the driver.

not sure if CONFIG_VIDEO_SM501NEW is a good chose here. Maybe we should use s.th. like CONFIG_VIDEO_SM50x. This applies to the file names too: sm50x.h, sm50x.c, etc. Even better would be a merge with the existing driver.

The CONFIG_VIDEO_SM501 driver is completely differently configured (boards supply tables with register settings). This will be very hard to merge. SM50x might be a better name, but is it good style to mix lowercase and uppercase letters in macro name?

<snip>

Quoted 117 lines
Quoted 29 lines
drivers/video/sm501new.h renamed from /drivers/video/sm501new.h +29 -0
+#define SM501FB_FLAG_USE_INIT_MODE	(1<<0)
+#define SM501FB_FLAG_DISABLE_AT_EXIT	(1<<1)
+#define SM501FB_FLAG_USE_HWCURSOR	(1<<2)
+#define SM501FB_FLAG_USE_HWACCEL	(1<<3)
+
+struct sm501_platdata_fbsub {
+	struct fb_videomode	*def_mode;
+	unsigned int		 def_bpp;
+	unsigned long		 max_mem;
+	unsigned int		 flags;
+};
+
+enum sm501_fb_routing {
+	SM501_FB_OWN		= 0,	/* CRT=>CRT, Panel=>Panel */
+	SM501_FB_CRT_PANEL	= 1,	/* Panel=>CRT, Panel=>Panel */
+};
+
+/* sm501_platdata_fb flag field bit definitions */
+
+#define SM501_FBPD_SWAP_FB_ENDIAN	(1<<0)	/* need to endian swap */
+
+/* sm501_platdata_fb
+ *
+ * configuration data for the framebuffer driver
+*/
+
+struct sm501_platdata_fb {
+	enum sm501_fb_routing		 fb_route;
+	unsigned int			 flags;

drivers/video/sm501new.h line 62

Quoted 10 lines
drivers/video/sm501new.h renamed from /drivers/video/sm501new.h +10 -0
+	struct sm501_platdata_fbsub	*fb_crt;
+	struct sm501_platdata_fbsub	*fb_pnl;
+};
+
+/* gpio i2c */
+
+struct sm501_platdata_gpio_i2c {
+	unsigned int		pin_sda;
+	unsigned int		pin_scl;
+};

all this stuff above starting from
"#define SM501FB_FLAG_USE_INIT_MODE"
can be removed if you remove "init_gpiop", "fb", "gpio_i2c" and "gpio_i2c_nr" from the "struct sm501_platdata" definition below. Also remove ".fb = &sm501_fb_pdata" from "sm501_pci_platdata" declaration in drivers/video/sm501new.c. These structure members aren't referenced in this U-Boot driver, so they aren't needed (unused and nearly dead code and data).

<snip>

drivers/video/sm501new.h line 83

Quoted 9 lines
drivers/video/sm501new.h renamed from /drivers/video/sm501new.h +9 -0
+#define SM501_USE_USB_HOST	(1<<0)
+#define SM501_USE_USB_SLAVE	(1<<1)
+#define SM501_USE_SSP0		(1<<2)
+#define SM501_USE_SSP1		(1<<3)
+#define SM501_USE_UART0		(1<<4)
+#define SM501_USE_UART1		(1<<5)
+#define SM501_USE_FBACCEL	(1<<6)
+#define SM501_USE_AC97		(1<<7)
+#define SM501_USE_I2S		(1<<8)

These macros aren't used, remove them too.

drivers/video/sm501new.h line 93

Quoted 10 lines
drivers/video/sm501new.h renamed from /drivers/video/sm501new.h +10 -0
+
+#define SM501_USE_ALL		(0xffffffff)
+
+struct sm501_initdata {
+	struct sm501_reg_init	gpio_low;
+	struct sm501_reg_init	gpio_high;
+	struct sm501_reg_init	misc_timing;
+	struct sm501_reg_init	misc_control;
+
+	unsigned long		devices;

"devices" member is only initialized in "sm501_pci_initdata" declaration and isn't referenced anywhere in the code, so another candidate to remove.

Quoted 5 lines
drivers/video/sm501new.h renamed from /drivers/video/sm501new.h +5 -0
+/* sm501_platdata
+ *
+ * This is passed with the platform device to allow the board
+ * to control the behaviour of the SM501 driver(s) which attach
+ * to the device.

drivers/video/sm501new.h line 124

Quoted 10 lines
drivers/video/sm501new.h renamed from /drivers/video/sm501new.h +10 -0
+ *
+*/
+
+struct sm501_platdata {
+	struct sm501_initdata		*init;
+	struct sm501_init_gpio		*init_gpiop;
+	struct sm501_platdata_fb	*fb;
+
+	struct sm501_platdata_gpio_i2c	*gpio_i2c;
+	unsigned int			 gpio_i2c_nr;

see above suggestion to remove init_gpiop, fb, gpio_i2c and gpio_i2c_nr.

Quoted 4 lines

diff -uprN u-boot-orig//drivers/video/sm501new-regs.h u-boot/drivers/video/sm501new-regs.h

drivers/video/sm501new-regs.h line 10

Quoted 10 lines
drivers/video/sm501new-regs.h renamed from /drivers/video/sm501new-regs.h +10 -0
@@ -0,0 +1,365 @@
+/* sm501-regs.h
+ *
+ * Copyright 2006 Simtec Electronics
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Silicon Motion SM501 register definitions
+*/

please, fix multi-line comment style.

Also check all below defined macros in this file. If some macro isn't used in the driver code, then remove it.

Quoted 14 lines
Quoted 13 lines
drivers/video/sm501new-regs.h renamed from /drivers/video/sm501new-regs.h +13 -0
+/* System Configuration area */
+/* System config base */
+#define SM501_SYS_CONFIG		(0x000000)
+
+/* config 1 */
+#define SM501_SYSTEM_CONTROL 		(0x000000)
+#define SM501_MISC_CONTROL		(0x000004)
+
+#define SM501_MISC_BUS_SH		(0x0)
+#define SM501_MISC_BUS_PCI		(0x1)
+#define SM501_MISC_BUS_XSCALE		(0x2)
+#define SM501_MISC_BUS_NEC		(0x6)
+#define SM501_MISC_BUS_MASK		(0x7)

<snip>

I agree in removing dead code and structure components that will never make sense in u-boot environment. However, should I really delete definitions form -regs.h? This is well developed (linux) and things might be needed for future development. I did not touch this file compared to kernel source.

- Stefan

#3 lore raw

PATCH 1/1 video: Add new driver for Silicon Motion SM501/SM502 Part 1/2

In reply to Anatolij Gustschin

Dear Anatolij & Stefan,

Quoted 7 lines · In message <[email protected]> you wrote:
Quoted 2 lines

Use CONFIG_VIDEO_SM501NEW to enable the driver.

not sure if CONFIG_VIDEO_SM501NEW is a good chose here. Maybe we should use s.th. like CONFIG_VIDEO_SM50x. This applies to the file names too: sm50x.h, sm50x.c, etc. Even better would be a merge with the existing driver.

I agree with Anatolij here. A merge would definitely be best.

Best regards,

Wolfgang Denk

Signature · 5 lines
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: wd at denx.de
Any sufficiently advanced  technology  is  indistinguishable  from  a
rigged demo.                              - Andy Finkel, computer guy
#4 lore raw

PATCH 1/1 video: Add new driver for Silicon Motion SM501/SM502 Part 1/2

Quoted 4 lines · Wolfgang Denk

Dear Anatolij & Stefan,

Quoted 1 line · In message <[email protected]> you wrote:
Quoted 8 lines
Quoted 6 lines
Quoted 1 line

Use CONFIG_VIDEO_SM501NEW to enable the driver.

not sure if CONFIG_VIDEO_SM501NEW is a good chose here. Maybe we should use s.th. like CONFIG_VIDEO_SM50x. This applies to the file names too: sm50x.h, sm50x.c, etc. Even better would be a merge with the existing driver.

I agree with Anatolij here. A merge would definitely be best.

We are about to build our first prototype for MPC8548E based motherboard and I also have SM502 on it. It is very good that there is somebody else working on it and I want to take part in the process.

As for the SM502, it is a multi-function chip that has more than just video. I'm writing an I2C driver for it right now and I want to ask you guys for your opinion.

MPC8548 has _TWO_ I2C controllers and it is taken care of in fsl_i2c.c by defining a "bus number." There is a function that one uses to set a bus for consecutive operations with i2c_read() and friends (they do NOT take a bus number as a parameter.) That means one sets a bus and then all the operations are done on that bus until it is changed again.

This might be OK but it is definitely not portable and SOC-specific. In my case I have a _THIRD_ I2C bus off of SM502... What do you think would be a best approach to address this:

a.) Rewrite _ALL_ I2C code to make those i2c_read() etc. functions to take
an additional parameter, bus number

b.) Make a global var i2c_bus or something and add a global function kinda
i2c_set_bus() so all i2c_read()/i2c_write() functions use that variable

c.) Add a third bus for SM502 I2C adapter to fsl_i2c.c (horrible hack)

d.) Make SM502 I2C a totally separate entity with its own set of functions

     (like sm502_i2c_read() etc.)

Please tell what you think. I personally lean towards option b.) but I might be wrong :)

And there is another useful part of SM502 that's begging for implementation -- USB controller with legacy KBD/Mouse support...

---
******************************************************************
* KSI at home KOI8 Net < > The impossible we do immediately. *
* Las Vegas NV, USA < > Miracles require 24-hour notice. *
******************************************************************

#5 lore raw

PATCH 1/1 video: Add new driver for Silicon Motion SM501/SM502 Part 1/2

Dear ksi at koi8.net,

Quoted 4 lines · In message <[email protected]> you wrote:

As for the SM502, it is a multi-function chip that has more than just video. I'm writing an I2C driver for it right now and I want to ask you guys for your opinion.

That's not new - the SM501 is pretty similar.

Quoted 5 lines

MPC8548 has _TWO_ I2C controllers and it is taken care of in fsl_i2c.c by defining a "bus number." There is a function that one uses to set a bus for consecutive operations with i2c_read() and friends (they do NOT take a bus number as a parameter.) That means one sets a bus and then all the operations are done on that bus until it is changed again.

That's the general idea, also for example for device handling: we set a current device (or bus) with one command, and then continue to use that.

Quoted 1 line

This might be OK but it is definitely not portable and SOC-specific. In my

I think the "this" here refers to the specific implementation, not the general approach, right?

Quoted 9 lines

case I have a _THIRD_ I2C bus off of SM502... What do you think would be a best approach to address this:

a.) Rewrite _ALL_ I2C code to make those i2c_read() etc. functions to take
an additional parameter, bus number

b.) Make a global var i2c_bus or something and add a global function kinda
i2c_set_bus() so all i2c_read()/i2c_write() functions use that variable

Quoted 7 lines

c.) Add a third bus for SM502 I2C adapter to fsl_i2c.c (horrible hack)

d.) Make SM502 I2C a totally separate entity with its own set of functions

     (like sm502_i2c_read() etc.)

Please tell what you think. I personally lean towards option b.) but I might be wrong :)

I agree.

Quoted 2 lines

And there is another useful part of SM502 that's begging for implementation -- USB controller with legacy KBD/Mouse support...

Feel free to submit patches :-)

Best regards,

Wolfgang Denk

Signature · 5 lines
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: wd at denx.de
You're too beautiful to ignore.  Too much woman.
	-- Kirk to Yeoman Rand, "The Enemy Within", stardate unknown
#6 lore raw

PATCH 1/1 video: Add new driver for Silicon Motion SM501/SM502 Part 1/2

Quoted 5 lines · Wolfgang Denk

Dear ksi at koi8.net,

In message <[email protected]> you

Quoted 1 line · wrote:
Quoted 7 lines
Quoted 1 line

As for the SM502, it is a multi-function chip that has more than just

video.

Quoted 1 line

I'm writing an I2C driver for it right now and I want to ask you guys

for

Quoted 1 line

your opinion.

That's not new - the SM501 is pretty similar.

As a matter of fact, SM501 is an older, now nonexistent version of SM502. Its support in U-Boot is rudimentary. I'd rather removed that old sm501.c altogether and replaced it with a new sm502.c. That should work for old SM501 chips if there are still any in existence.

Support is much better in Linux kernel -- it is almost fully supported out of the box, video, USB, sound etc.

Quoted 13 lines
Quoted 1 line

MPC8548 has _TWO_ I2C controllers and it is taken care of in fsl_i2c.c

by

Quoted 1 line

defining a "bus number." There is a function that one uses to set a

bus for

Quoted 1 line

consecutive operations with i2c_read() and friends (they do NOT take a

bus

Quoted 2 lines

number as a parameter.) That means one sets a bus and then all the operations are done on that bus until it is changed again.

That's the general idea, also for example for device handling: we set a current device (or bus) with one command, and then continue to use that.

Quoted 5 lines
Quoted 1 line

This might be OK but it is definitely not portable and SOC-specific.

In my

I think the "this" here refers to the specific implementation, not the general approach, right?

Yes.

Quoted 16 lines
Quoted 1 line

case I have a _THIRD_ I2C bus off of SM502... What do you think would

be a

Quoted 3 lines

best approach to address this:

a.) Rewrite _ALL_ I2C code to make those i2c_read() etc. functions to

take

Quoted 3 lines

an additional parameter, bus number

b.) Make a global var i2c_bus or something and add a global function

kinda

Quoted 1 line

i2c_set_bus() so all i2c_read()/i2c_write() functions use that

variable

Quoted 4 lines

c.) Add a third bus for SM502 I2C adapter to fsl_i2c.c (horrible hack)

d.) Make SM502 I2C a totally separate entity with its own set of

Quoted 8 lines

functions

Quoted 3 lines
     (like sm502_i2c_read() etc.)

Please tell what you think. I personally lean towards option b.) but I

might

Quoted 1 line

be wrong :)

I agree.

OK, so I'll take that route.

Quoted 5 lines
Quoted 1 line

And there is another useful part of SM502 that's begging for

implementation

Quoted 1 line

-- USB controller with legacy KBD/Mouse support...

Feel free to submit patches :-)

Sure, but there are other things that must me done before that USB. I need Silicon Image Sil3124A SATA driver first :)

---
******************************************************************
* KSI at home KOI8 Net < > The impossible we do immediately. *
* Las Vegas NV, USA < > Miracles require 24-hour notice. *
******************************************************************

#7 lore raw

PATCH 1/1 video: Add new driver for Silicon Motion SM501/SM502 Part 1/2

Dear ksi at koi8.net,

Quoted 2 lines · In message <[email protected]> you wrote:

As a matter of fact, SM501 is an older, now nonexistent version of SM502.

Yeah. Tell that to some hardware companies who are shipping boards with the SM501 on it. :-)

Quoted 3 lines

Its support in U-Boot is rudimentary. I'd rather removed that old sm501.c altogether and replaced it with a new sm502.c. That should work for old SM501 chips if there are still any in existence.

They are, and will be in existence at least for a couple of years (my expectation for couple is a two-digit number).

Quoted 2 lines

Support is much better in Linux kernel -- it is almost fully supported out of the box, video, USB, sound etc.

Linux is an OS - U-Boot is a mere boot loader ;-)

Best regards,

Wolfgang Denk

Signature · 5 lines
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: wd at denx.de
Defaults are wonderful, just like fire.
                  - Larry Wall in <[email protected]>
#8 lore raw

PATCH 1/1 video: Add new driver for Silicon Motion SM501/SM502 Part 1/2

Quoted 10 lines · Wolfgang Denk

Dear ksi at koi8.net,

In message <[email protected]> you

Quoted 2 lines · wrote:

As a matter of fact, SM501 is an older, now nonexistent version of

SM502.

Yeah. Tell that to some hardware companies who are shipping boards with the SM501 on it. :-)

They must be well stocked up with those :) Yeah, sure there are still such boards and they will still exist in foreseable future. But I personally think it is not a reason for that old basic driver to hang out forever if the new one can also work with old boards with minimal changes.

Quoted 8 lines
Quoted 1 line

Its support in U-Boot is rudimentary. I'd rather removed that old

sm501.c

Quoted 1 line

altogether and replaced it with a new sm502.c. That should work for

old

Quoted 1 line

SM501 chips if there are still any in existence.

They are, and will be in existence at least for a couple of years (my expectation for couple is a two-digit number).

They must have loads of them in their inventories... Yes, I agree they will be used until inventories run dry but it is not something that has future.

I would rather suggest having 2 separate drivers--sm501.c and sm502.c--for a transitional period. Then we could rework all boards using old sm501.c to use the new driver, one by one, and when the last one is converted we'll be able to get rid of the old code.

Just thoughts, ya know...

Quoted 5 lines
Quoted 1 line

Support is much better in Linux kernel -- it is almost fully supported

out

Quoted 1 line

of the box, video, USB, sound etc.

Linux is an OS - U-Boot is a mere boot loader ;-)

Eh, for some U-Boot is also an OS...

---
******************************************************************
* KSI at home KOI8 Net < > The impossible we do immediately. *
* Las Vegas NV, USA < > Miracles require 24-hour notice. *
******************************************************************

#9 lore raw

PATCH 1/1 video: Add new driver for Silicon Motion SM501/SM502 Part 1/2

In reply to Wolfgang Denk

Dear All,

Quoted 10 lines

Dear Anatolij & Stefan,

Quoted 5 lines · In message <[email protected]> you wrote:
Quoted 1 line

Use CONFIG_VIDEO_SM501NEW to enable the driver.

not sure if CONFIG_VIDEO_SM501NEW is a good chose here. Maybe we should use s.th. like CONFIG_VIDEO_SM50x. This applies to the file names too: sm50x.h, sm50x.c, etc. Even better would be a merge with the existing driver.

I agree with Anatolij here. A merge would definitely be best.

Before I start to implement the good suggestions, I'd like to know how such a merge would look like in your opinion.

Over the long term, I see the old driver vanishing, as it is too complicated to use (you need to be a video and SMI register expert). It is not much more than a jump into the board specific setup routines. However, removing the old driver would break half a dozen of boards (inacceptable).

BTW the driver will probably also work with the new SM107, which as no USB, Keyboard and all this stuff.

-- Stefan

#10 lore raw

PATCH 1/1 video: Add new driver for Silicon Motion SM501/SM502 Part 1/2

Hello Stefan,

Quoted 6 lines · Stefan Althoefer

Dear All,

Quoted 4 lines

Dear Anatolij & Stefan,

Quoted 1 line · In message <[email protected]> you wrote:
Quoted 1 line

Use CONFIG_VIDEO_SM501NEW to enable the driver.

Quoted 8 lines
Quoted 5 lines
Quoted 4 lines

not sure if CONFIG_VIDEO_SM501NEW is a good chose here. Maybe we should use s.th. like CONFIG_VIDEO_SM50x. This applies to the file names too: sm50x.h, sm50x.c, etc. Even better would be a merge with the existing driver.

I agree with Anatolij here. A merge would definitely be best.

Before I start to implement the good suggestions, I'd like to know how such a merge would look like in your opinion.

see inlined patch below how it could be done without removing old sm501 code. Defining CONFIG_VIDEO_SM501_PCI enables using new sm501 driver code.

Quoted 5 lines

Over the long term, I see the old driver vanishing, as it is too complicated to use (you need to be a video and SMI register expert). It is not much more than a jump into the board specific setup routines. However, removing the old driver would break half a dozen of boards (inacceptable).

we do not have to remove old code. Everyone who doesn't additionally define CONFIG_VIDEO_SM501_PCI will be able to use it. The advantage of the old code is that it is small. This is fundamental design principle #1 of U-Boot:
http://www.denx.de/wiki/view/U-Boot/DesignPrinciples#1_Keep_it_Small

I agree that the old sm501 code is suboptimal and could be improved.

drivers/video/sm501.c +37 -28
index 283d2d9..20a5335 100644
@@ -33,30 +33,35 @@
 
 #include <video_fb.h>
 #include <sm501.h>
-
-#define read8(ptrReg)                \
-    *(volatile unsigned char *)(sm501.isaBase + ptrReg)
-
-#define write8(ptrReg,value) \
-    *(volatile unsigned char *)(sm501.isaBase + ptrReg) = value
-
-#define read16(ptrReg) \
-    (*(volatile unsigned short *)(sm501.isaBase + ptrReg))
-
-#define write16(ptrReg,value) \
-    (*(volatile unsigned short *)(sm501.isaBase + ptrReg) = value)
-
-#define read32(ptrReg) \
-    (*(volatile unsigned int *)(sm501.isaBase + ptrReg))
-
-#define write32(ptrReg, value) \
-    (*(volatile unsigned int *)(sm501.isaBase + ptrReg) = value)
+#ifdef CONFIG_VIDEO_SM501_PCI
+#include <pci.h>
+#include "videomodes.h"
+#include "sm50x-regs.h"
+#include "sm50x.h"
+#endif
 
 GraphicDevice sm501;
 
-/*-----------------------------------------------------------------------------
- * SmiSetRegs --
- *-----------------------------------------------------------------------------
+#ifdef CONFIG_VIDEO_SM501_PCI
+/*
+ * code used in sm501_pci_init()
+ * comes here.
+ */
+
+static int sm501_pci_init(void)
+{
+	GraphicDevice *pGD = (GraphicDevice *)&sm501;
+	/*
+	 * Code to find the pci devide, setup video mode and
+	 * init sm501 struct comes here.
+	 * return 0 on success, non-zero otherwise.
+	 * This is mainly the code you currently have
+	 * in video_hw_init() in sm501new.c file.
+	 */
+}
+#else
+/*
+ * SmiSetRegs
  */
 static void SmiSetRegs (void)
 {
@@ -66,7 +71,7 @@ static void SmiSetRegs (void)
 	 */
 	const SMI_REGS *preg = board_get_regs ();
 	while (preg->Index) {
-		write32 (preg->Index, preg->Value);
+		writel (preg->Value, sm501.isaBase + preg->Index);
 		/*
 		 * Insert a delay between
 		 */
@@ -74,10 +79,10 @@ static void SmiSetRegs (void)
 		preg ++;
 	}
 }
+#endif
 
-/*-----------------------------------------------------------------------------
- * video_hw_init --
- *-----------------------------------------------------------------------------
+/*
+ * video_hw_init
  */
 void *video_hw_init (void)
 {
@@ -85,6 +90,7 @@ void *video_hw_init (void)
 
 	memset (&sm501, 0, sizeof (GraphicDevice));
 
+#ifndef CONFIG_VIDEO_SM501_PCI
 	/*
 	 * Initialization of the access to the graphic chipset Retreive base
 	 * address of the chipset (see board/RPXClassic/eccx.c)
@@ -122,6 +128,10 @@ void *video_hw_init (void)
 
 	/* (see board/RPXClassic/RPXClassic.c) */
 	board_validate_screen (sm501.isaBase);
+#else
+	if (!sm501_pci_init())
+		return 0;
+#endif /* CONFIG_VIDEO_SM501_PCI */
 
 	/* Clear video memory */
 	i = sm501.memSize/4;
@@ -132,9 +142,8 @@ void *video_hw_init (void)
 	return (&sm501);
 }
 
-/*-----------------------------------------------------------------------------
- * video_set_lut --
- *-----------------------------------------------------------------------------
+/*
+ * video_set_lut
  */
 void video_set_lut (
 	unsigned int index,           /* color number */
Signature · 8 lines
Better suggestions are always welcome.

Best regards,
Anatolij

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