2011-03-22 08:27:44

by Heiko Schocher

[permalink] [raw]
Subject: [PATCH v6 0/6] powerpc, 52xx: add charon board support

cc: Wolfram Sang <[email protected]>
cc: Grant Likely <[email protected]>
cc: Benjamin Herrenschmidt <[email protected]>
cc: [email protected]
cc: [email protected]
cc: Ben Dooks <[email protected]>
cc: Vincent Sanders <[email protected]>
cc: Samuel Ortiz <[email protected]>
cc: [email protected]
cc: Randy Dunlap <[email protected]>
cc: Wolfgang Denk <[email protected]>
cc: Paul Mundt <[email protected]>

changes since v5:
- repost complete patchseries, as Paul Mundt suggested
- rebased against current head
- add Acked-by from Samuel Ortiz (MFD parts)
http://www.spinics.net/lists/linux-fbdev/msg02550.html
http://linux.derkeiler.com/Mailing-Lists/Kernel/2011-01/msg11798.html

and Benjamin Herrenschmidt (DTS parts)
http://lists.ozlabs.org/pipermail/linuxppc-dev/2011-February/088279.html
- removed patch
"powerpc, mpc5200: update mpc5200_defconfig to fit for charon board."
therefore added
"powerpc, tqm5200: update tqm5200_defconfig to fit for charon board."

Paul: before adding this patchseries, this patch should get
an Acked-by from a powerpc maintainer.

checkpatch says:
total: 0 errors, 0 warnings, 233 lines checked

20110322/0001-powerpc-5200-add-support-for-charon-board.patch has no obvious style problems and is ready for submission.
total: 0 errors, 0 warnings, 841 lines checked

20110322/0002-video-sm501-add-I-O-functions-for-use-on-powerpc.patch has no obvious style problems and is ready for submission.
total: 0 errors, 0 warnings, 109 lines checked

20110322/0003-video-sm501-add-edid-and-commandline-support.patch has no obvious style problems and is ready for submission.
total: 0 errors, 0 warnings, 106 lines checked

20110322/0004-video-sm501-add-OF-binding-to-support-SM501.patch has no obvious style problems and is ready for submission.
total: 0 errors, 0 warnings, 22 lines checked

20110322/0005-powerpc-video-add-SM501-support-for-charon-board.patch has no obvious style problems and is ready for submission.
total: 0 errors, 0 warnings, 82 lines checked

20110322/0006-powerpc-tqm5200-update-tqm5200_defconfig-to-fit-for-.patch has no obvious style problems and is ready for submission.

Heiko Schocher (6):
powerpc, 5200: add support for charon board
video, sm501: add I/O functions for use on powerpc
video, sm501: add edid and commandline support
video, sm501: add OF binding to support SM501
powerpc, video: add SM501 support for charon board.
powerpc, tqm5200: update tqm5200_defconfig to fit for charon board.

Documentation/fb/sm501.txt | 10 +
Documentation/powerpc/dts-bindings/sm501.txt | 34 ++++
arch/powerpc/boot/dts/charon.dts | 236 ++++++++++++++++++++++
arch/powerpc/configs/52xx/tqm5200_defconfig | 20 ++-
arch/powerpc/platforms/52xx/mpc5200_simple.c | 1 +
drivers/mfd/sm501.c | 133 +++++++------
drivers/video/sm501fb.c | 272 +++++++++++++++++---------
include/linux/sm501.h | 8 +
8 files changed, 555 insertions(+), 159 deletions(-)
create mode 100644 Documentation/fb/sm501.txt
create mode 100644 Documentation/powerpc/dts-bindings/sm501.txt
create mode 100644 arch/powerpc/boot/dts/charon.dts

--
1.7.4


2011-03-22 08:27:48

by Heiko Schocher

[permalink] [raw]
Subject: [PATCH v6 6/6] powerpc, tqm5200: update tqm5200_defconfig to fit for charon board.

added:

CONFIG_MTD_OF_PARTS
CONFIG_MTD_PLATRAM
CONFIG_FIXED_PHY
CONFIG_SENSORS_LM80
CONFIG_MFD_SM501
CONFIG_FB
CONFIG_FB_FOREIGN_ENDIAN
CONFIG_FB_SM501
CONFIG_FRAMEBUFFER_CONSOLE
CONFIG_RTC_DRV_DS1374

Signed-off-by: Heiko Schocher <[email protected]>
cc: Wolfram Sang <[email protected]>
cc: Grant Likely <[email protected]>
cc: Benjamin Herrenschmidt <[email protected]>
cc: [email protected]
cc: [email protected]
cc: Ben Dooks <[email protected]>
cc: Vincent Sanders <[email protected]>
cc: Samuel Ortiz <[email protected]>
cc: [email protected]
cc: Randy Dunlap <[email protected]>
cc: Wolfgang Denk <[email protected]>
cc: Paul Mundt <[email protected]>
---
- changes since v1:
added Grant Likely to cc
- changes for v6:
- new in this version, therefore patch
"powerpc, mpc5200: update mpc5200_defconfig to fit for charon board."
removed.
As this board is tqm5200 based, added necessary changes
to the tqm5200_defconfig. In previous patchserie I added
the changes to mpc5200_defconfig, as Wolfram Sang mentioned,
but as tqm5200_defconfig is in mainline, and the board is
tqm5200 based, I think, thats the appropriate place, as
new defconfigs are not accepted. Paul, before applying
this patch series, this patch should get an Acked by
from a powerpc maintainer...
- repost the complete patchserie as Paul Mundt suggested

arch/powerpc/configs/52xx/tqm5200_defconfig | 20 ++++++++++++--------
1 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/arch/powerpc/configs/52xx/tqm5200_defconfig b/arch/powerpc/configs/52xx/tqm5200_defconfig
index 959cd2c..716a37b 100644
--- a/arch/powerpc/configs/52xx/tqm5200_defconfig
+++ b/arch/powerpc/configs/52xx/tqm5200_defconfig
@@ -1,9 +1,10 @@
CONFIG_EXPERIMENTAL=y
CONFIG_SYSVIPC=y
+CONFIG_SPARSE_IRQ=y
CONFIG_LOG_BUF_SHIFT=14
CONFIG_BLK_DEV_INITRD=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-CONFIG_EXPERT=y
+CONFIG_EMBEDDED=y
# CONFIG_SYSCTL_SYSCALL is not set
# CONFIG_KALLSYMS is not set
# CONFIG_EPOLL is not set
@@ -17,7 +18,6 @@ CONFIG_PPC_MPC5200_SIMPLE=y
CONFIG_PPC_MPC5200_BUGFIX=y
# CONFIG_PPC_PMAC is not set
CONFIG_PPC_BESTCOMM=y
-CONFIG_SPARSE_IRQ=y
CONFIG_PM=y
# CONFIG_PCI is not set
CONFIG_NET=y
@@ -38,17 +38,18 @@ CONFIG_MTD=y
CONFIG_MTD_CONCAT=y
CONFIG_MTD_PARTITIONS=y
CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_OF_PARTS=y
CONFIG_MTD_CHAR=y
CONFIG_MTD_BLOCK=y
CONFIG_MTD_CFI=y
CONFIG_MTD_CFI_AMDSTD=y
CONFIG_MTD_ROM=y
CONFIG_MTD_PHYSMAP_OF=y
+CONFIG_MTD_PLATRAM=y
CONFIG_PROC_DEVICETREE=y
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=32768
-# CONFIG_MISC_DEVICES is not set
CONFIG_BLK_DEV_SD=y
CONFIG_CHR_DEV_SG=y
CONFIG_ATA=y
@@ -56,13 +57,11 @@ CONFIG_PATA_MPC52xx=y
CONFIG_PATA_PLATFORM=y
CONFIG_NETDEVICES=y
CONFIG_LXT_PHY=y
+CONFIG_FIXED_PHY=y
CONFIG_NET_ETHERNET=y
CONFIG_FEC_MPC52xx=y
# CONFIG_NETDEV_1000 is not set
# CONFIG_NETDEV_10000 is not set
-# CONFIG_INPUT is not set
-# CONFIG_SERIO is not set
-# CONFIG_VT is not set
CONFIG_SERIAL_MPC52xx=y
CONFIG_SERIAL_MPC52xx_CONSOLE=y
CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD=115200
@@ -70,7 +69,13 @@ CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD=115200
CONFIG_I2C=y
CONFIG_I2C_CHARDEV=y
CONFIG_I2C_MPC=y
+CONFIG_SENSORS_LM80=y
CONFIG_WATCHDOG=y
+CONFIG_MFD_SM501=y
+CONFIG_FB=y
+CONFIG_FB_FOREIGN_ENDIAN=y
+CONFIG_FB_SM501=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_USB=y
CONFIG_USB_DEVICEFS=y
# CONFIG_USB_DEVICE_CLASS is not set
@@ -80,10 +85,10 @@ CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
CONFIG_USB_STORAGE=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_DS1307=y
+CONFIG_RTC_DRV_DS1374=y
CONFIG_EXT2_FS=y
CONFIG_EXT3_FS=y
# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
-CONFIG_INOTIFY=y
CONFIG_MSDOS_FS=y
CONFIG_VFAT_FS=y
CONFIG_PROC_KCORE=y
@@ -102,7 +107,6 @@ CONFIG_DEBUG_KERNEL=y
CONFIG_DETECT_HUNG_TASK=y
# CONFIG_DEBUG_BUGVERBOSE is not set
CONFIG_DEBUG_INFO=y
-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
CONFIG_CRYPTO_ECB=y
CONFIG_CRYPTO_PCBC=y
# CONFIG_CRYPTO_ANSI_CPRNG is not set
--
1.7.4

2011-03-22 08:27:42

by Heiko Schocher

[permalink] [raw]
Subject: [PATCH v6 5/6] powerpc, video: add SM501 support for charon board.

Signed-off-by: Heiko Schocher <[email protected]>
cc: Wolfram Sang <[email protected]>
cc: Grant Likely <[email protected]>
cc: Benjamin Herrenschmidt <[email protected]>
cc: [email protected]
cc: [email protected]
cc: Ben Dooks <[email protected]>
cc: Vincent Sanders <[email protected]>
cc: Samuel Ortiz <[email protected]>
cc: [email protected]
cc: Randy Dunlap <[email protected]>
cc: Wolfgang Denk <[email protected]>
cc: Paul Mundt <[email protected]>
---
- changes since v1:
- no board specific defconfig file for mpc52xx based boards as suggested
from Wolfram Sang

- changes since v2:
add Ben Dooks, Vincent Sanders and Samuel Ortiz and lkml to cc, as
suggested from Paul Mundt.

- changes since v3:
- rebased against v2.6.38-rc2
- changes since v4:
- added Paul Mundt to cc (Sorry forgot this in series v4)

arch/powerpc/boot/dts/charon.dts | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/boot/dts/charon.dts b/arch/powerpc/boot/dts/charon.dts
index 9776889..0e00e50 100644
--- a/arch/powerpc/boot/dts/charon.dts
+++ b/arch/powerpc/boot/dts/charon.dts
@@ -186,6 +186,7 @@
#address-cells = <2>;
#size-cells = <1>;
ranges = < 0 0 0xfc000000 0x02000000
+ 1 0 0xe0000000 0x04000000 // CS1 range, SM501
3 0 0xe8000000 0x00080000>;

flash@0,0 {
@@ -197,6 +198,15 @@
#address-cells = <1>;
};

+ display@1,0 {
+ compatible = "smi,sm501";
+ reg = <1 0x00000000 0x00800000
+ 1 0x03e00000 0x00200000>;
+ mode = "640x480-32@60";
+ interrupts = <1 1 3>;
+ little-endian;
+ };
+
mram0@3,0 {
compatible = "mtd-ram";
reg = <3 0x00000 0x80000>;
--
1.7.4

2011-03-22 08:28:18

by Heiko Schocher

[permalink] [raw]
Subject: [PATCH v1 1/6] powerpc, 5200: add support for charon board

Signed-off-by: Heiko Schocher <[email protected]>
Acked-by: Benjamin Herrenschmidt <[email protected]>
cc: Wolfram Sang <[email protected]>
cc: Grant Likely <[email protected]>
cc: Benjamin Herrenschmidt <[email protected]>
cc: [email protected]
cc: [email protected]
cc: Ben Dooks <[email protected]>
cc: Vincent Sanders <[email protected]>
cc: Samuel Ortiz <[email protected]>
cc: [email protected]
cc: Randy Dunlap <[email protected]>
cc: Wolfgang Denk <[email protected]>
cc: Paul Mundt <[email protected]>
---
- changes since v1:
add comments from Wolfram Sang
- no defconfig file
- comment corrected in DTS
- boardlist sorted alphabetically
- commit log without boardinfo
- changes for v6:
- rebased against current head
- repost complete patchserie
- added Acked-by from Benjamin Herrenschmidt

arch/powerpc/boot/dts/charon.dts | 226 ++++++++++++++++++++++++++
arch/powerpc/platforms/52xx/mpc5200_simple.c | 1 +
2 files changed, 227 insertions(+), 0 deletions(-)
create mode 100644 arch/powerpc/boot/dts/charon.dts

diff --git a/arch/powerpc/boot/dts/charon.dts b/arch/powerpc/boot/dts/charon.dts
new file mode 100644
index 0000000..9776889
--- /dev/null
+++ b/arch/powerpc/boot/dts/charon.dts
@@ -0,0 +1,226 @@
+/*
+ * charon board Device Tree Source
+ *
+ * Copyright (C) 2007 Semihalf
+ * Marian Balakowicz <[email protected]>
+ *
+ * Copyright (C) 2010 DENX Software Engineering GmbH
+ * Heiko Schocher <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ */
+
+/dts-v1/;
+
+/ {
+ model = "anon,charon";
+ compatible = "anon,charon";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ interrupt-parent = <&mpc5200_pic>;
+
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ PowerPC,5200@0 {
+ device_type = "cpu";
+ reg = <0>;
+ d-cache-line-size = <32>;
+ i-cache-line-size = <32>;
+ d-cache-size = <0x4000>; // L1, 16K
+ i-cache-size = <0x4000>; // L1, 16K
+ timebase-frequency = <0>; // from bootloader
+ bus-frequency = <0>; // from bootloader
+ clock-frequency = <0>; // from bootloader
+ };
+ };
+
+ memory {
+ device_type = "memory";
+ reg = <0x00000000 0x08000000>; // 128MB
+ };
+
+ soc5200@f0000000 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ compatible = "fsl,mpc5200-immr";
+ ranges = <0 0xf0000000 0x0000c000>;
+ reg = <0xf0000000 0x00000100>;
+ bus-frequency = <0>; // from bootloader
+ system-frequency = <0>; // from bootloader
+
+ cdm@200 {
+ compatible = "fsl,mpc5200-cdm";
+ reg = <0x200 0x38>;
+ };
+
+ mpc5200_pic: interrupt-controller@500 {
+ // 5200 interrupts are encoded into two levels;
+ interrupt-controller;
+ #interrupt-cells = <3>;
+ compatible = "fsl,mpc5200-pic";
+ reg = <0x500 0x80>;
+ };
+
+ timer@600 { // General Purpose Timer
+ compatible = "fsl,mpc5200-gpt";
+ reg = <0x600 0x10>;
+ interrupts = <1 9 0>;
+ fsl,has-wdt;
+ };
+
+ can@900 {
+ compatible = "fsl,mpc5200-mscan";
+ interrupts = <2 17 0>;
+ reg = <0x900 0x80>;
+ };
+
+ can@980 {
+ compatible = "fsl,mpc5200-mscan";
+ interrupts = <2 18 0>;
+ reg = <0x980 0x80>;
+ };
+
+ gpio_simple: gpio@b00 {
+ compatible = "fsl,mpc5200-gpio";
+ reg = <0xb00 0x40>;
+ interrupts = <1 7 0>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ };
+
+ usb@1000 {
+ compatible = "fsl,mpc5200-ohci","ohci-be";
+ reg = <0x1000 0xff>;
+ interrupts = <2 6 0>;
+ };
+
+ dma-controller@1200 {
+ device_type = "dma-controller";
+ compatible = "fsl,mpc5200-bestcomm";
+ reg = <0x1200 0x80>;
+ interrupts = <3 0 0 3 1 0 3 2 0 3 3 0
+ 3 4 0 3 5 0 3 6 0 3 7 0
+ 3 8 0 3 9 0 3 10 0 3 11 0
+ 3 12 0 3 13 0 3 14 0 3 15 0>;
+ };
+
+ xlb@1f00 {
+ compatible = "fsl,mpc5200-xlb";
+ reg = <0x1f00 0x100>;
+ };
+
+ serial@2000 { // PSC1
+ compatible = "fsl,mpc5200-psc-uart";
+ reg = <0x2000 0x100>;
+ interrupts = <2 1 0>;
+ };
+
+ serial@2400 { // PSC3
+ compatible = "fsl,mpc5200-psc-uart";
+ reg = <0x2400 0x100>;
+ interrupts = <2 3 0>;
+ };
+
+ ethernet@3000 {
+ compatible = "fsl,mpc5200-fec";
+ reg = <0x3000 0x400>;
+ local-mac-address = [ 00 00 00 00 00 00 ];
+ interrupts = <2 5 0>;
+ fixed-link = <1 1 100 0 0>;
+ };
+
+ mdio@3000 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ compatible = "fsl,mpc5200-mdio";
+ reg = <0x3000 0x400>; // fec range, since we need to setup fec interrupts
+ interrupts = <2 5 0>; // these are for "mii command finished", not link changes & co.
+ };
+
+ ata@3a00 {
+ compatible = "fsl,mpc5200-ata";
+ reg = <0x3a00 0x100>;
+ interrupts = <2 7 0>;
+ };
+
+ i2c@3d00 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ compatible = "fsl,mpc5200-i2c","fsl-i2c";
+ reg = <0x3d00 0x40>;
+ interrupts = <2 15 0>;
+ };
+
+
+ i2c@3d40 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ compatible = "fsl,mpc5200-i2c","fsl-i2c";
+ reg = <0x3d40 0x40>;
+ interrupts = <2 16 0>;
+
+ dtt@28 {
+ compatible = "national,lm80";
+ reg = <0x28>;
+ };
+
+ rtc@68 {
+ compatible = "dallas,ds1374";
+ reg = <0x68>;
+ };
+ };
+
+ sram@8000 {
+ compatible = "fsl,mpc5200-sram";
+ reg = <0x8000 0x4000>;
+ };
+ };
+
+ localbus {
+ compatible = "fsl,mpc5200-lpb","simple-bus";
+ #address-cells = <2>;
+ #size-cells = <1>;
+ ranges = < 0 0 0xfc000000 0x02000000
+ 3 0 0xe8000000 0x00080000>;
+
+ flash@0,0 {
+ compatible = "cfi-flash";
+ reg = <0 0 0x02000000>;
+ bank-width = <4>;
+ device-width = <2>;
+ #size-cells = <1>;
+ #address-cells = <1>;
+ };
+
+ mram0@3,0 {
+ compatible = "mtd-ram";
+ reg = <3 0x00000 0x80000>;
+ bank-width = <1>;
+ };
+ };
+
+ pci@f0000d00 {
+ #interrupt-cells = <1>;
+ #size-cells = <2>;
+ #address-cells = <3>;
+ device_type = "pci";
+ compatible = "fsl,mpc5200-pci";
+ reg = <0xf0000d00 0x100>;
+ interrupt-map-mask = <0xf800 0 0 7>;
+ interrupt-map = <0xc000 0 0 1 &mpc5200_pic 0 0 3
+ 0xc000 0 0 2 &mpc5200_pic 0 0 3
+ 0xc000 0 0 3 &mpc5200_pic 0 0 3
+ 0xc000 0 0 4 &mpc5200_pic 0 0 3>;
+ clock-frequency = <0>; // From boot loader
+ interrupts = <2 8 0 2 9 0 2 10 0>;
+ bus-range = <0 0>;
+ ranges = <0x42000000 0 0x80000000 0x80000000 0 0x10000000
+ 0x02000000 0 0x90000000 0x90000000 0 0x10000000
+ 0x01000000 0 0x00000000 0xa0000000 0 0x01000000>;
+ };
+};
diff --git a/arch/powerpc/platforms/52xx/mpc5200_simple.c b/arch/powerpc/platforms/52xx/mpc5200_simple.c
index e36d6e2..846b789 100644
--- a/arch/powerpc/platforms/52xx/mpc5200_simple.c
+++ b/arch/powerpc/platforms/52xx/mpc5200_simple.c
@@ -50,6 +50,7 @@ static void __init mpc5200_simple_setup_arch(void)

/* list of the supported boards */
static const char *board[] __initdata = {
+ "anon,charon",
"intercontrol,digsy-mtc",
"manroland,mucmc52",
"manroland,uc101",
--
1.7.4

2011-03-22 08:28:21

by Heiko Schocher

[permalink] [raw]
Subject: [PATCH v6 4/6] video, sm501: add OF binding to support SM501

- add binding to OF, compatible name "smi,sm501"

Signed-off-by: Heiko Schocher <[email protected]>
Acked-by: Samuel Ortiz <[email protected]>
cc: Wolfram Sang <[email protected]>
cc: Grant Likely <[email protected]>
cc: Benjamin Herrenschmidt <[email protected]>
cc: [email protected]
cc: [email protected]
cc: Ben Dooks <[email protected]>
cc: Vincent Sanders <[email protected]>
cc: Samuel Ortiz <[email protected]>
cc: [email protected]
cc: Randy Dunlap <[email protected]>
cc: Wolfgang Denk <[email protected]>
cc: Paul Mundt <[email protected]>
---
- changes since v1:
add Ben Dooks, Vincent Sanders and Samuel Ortiz to cc, as suggested from
Paul Mundt.
- changes since v2:
add comments from Randy Dunlap:
- move parameter documentation to Documentation/fb/sm501.txt
- changes since v3:
- rebased against v2.6.38-rc2
- split in 3 patches
- of support patch
- get rid of "#if defined(CONFIG_PPC_MPC52xx)" usage
hide this in DTS, as Paul suggested.
- i/o routine patch
- edid support patch
- changes since v4
replace remaining CONFIG_PPC_MPC52xx with CONFIG_OF, as
it is no longer MPC52xx only.
- changes since v5
free edid_data after its usage, as it is no longer needed,
suggested from Paul Mundt. Also fall back to default if
kmemdup(edid_data) fails.
- changes for v6:
- repost complete patchserie
- rebased against current head

Documentation/powerpc/dts-bindings/sm501.txt | 34 +++++++++++++++++++++++++
drivers/mfd/sm501.c | 8 +++++-
drivers/video/sm501fb.c | 35 +++++++++++++++++++++++++-
3 files changed, 75 insertions(+), 2 deletions(-)
create mode 100644 Documentation/powerpc/dts-bindings/sm501.txt

diff --git a/Documentation/powerpc/dts-bindings/sm501.txt b/Documentation/powerpc/dts-bindings/sm501.txt
new file mode 100644
index 0000000..7d319fb
--- /dev/null
+++ b/Documentation/powerpc/dts-bindings/sm501.txt
@@ -0,0 +1,34 @@
+* SM SM501
+
+The SM SM501 is a LCD controller, with proper hardware, it can also
+drive DVI monitors.
+
+Required properties:
+- compatible : should be "smi,sm501".
+- reg : contain two entries:
+ - First entry: System Configuration register
+ - Second entry: IO space (Display Controller register)
+- interrupts : SMI interrupt to the cpu should be described here.
+- interrupt-parent : the phandle for the interrupt controller that
+ services interrupts for this device.
+
+Optional properties:
+- mode : select a video mode:
+ <xres>x<yres>[-<bpp>][@<refresh>]
+- edid : verbatim EDID data block describing attached display.
+ Data from the detailed timing descriptor will be used to
+ program the display controller.
+- little-endian: availiable on big endian systems, to
+ set different foreign endian.
+- big-endian: availiable on little endian systems, to
+ set different foreign endian.
+
+Example for MPC5200:
+ display@1,0 {
+ compatible = "smi,sm501";
+ reg = <1 0x00000000 0x00800000
+ 1 0x03e00000 0x00200000>;
+ interrupts = <1 1 3>;
+ mode = "640x480-32@60";
+ edid = [edid-data];
+ };
diff --git a/drivers/mfd/sm501.c b/drivers/mfd/sm501.c
index 558d5f3..574f696 100644
--- a/drivers/mfd/sm501.c
+++ b/drivers/mfd/sm501.c
@@ -1377,7 +1377,7 @@ static int __devinit sm501_init_dev(struct sm501_devdata *sm)
sm501_register_gpio(sm);
}

- if (pdata->gpio_i2c != NULL && pdata->gpio_i2c_nr > 0) {
+ if (pdata && 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
@@ -1735,10 +1735,16 @@ static struct pci_driver sm501_pci_driver = {

MODULE_ALIAS("platform:sm501");

+static struct of_device_id __devinitdata of_sm501_match_tbl[] = {
+ { .compatible = "smi,sm501", },
+ { /* end */ }
+};
+
static struct platform_driver sm501_plat_driver = {
.driver = {
.name = "sm501",
.owner = THIS_MODULE,
+ .of_match_table = of_sm501_match_tbl,
},
.probe = sm501_plat_probe,
.remove = sm501_plat_remove,
diff --git a/drivers/video/sm501fb.c b/drivers/video/sm501fb.c
index f31252c..f275385 100644
--- a/drivers/video/sm501fb.c
+++ b/drivers/video/sm501fb.c
@@ -1729,6 +1729,15 @@ static int sm501fb_init_fb(struct fb_info *fb,
FBINFO_HWACCEL_COPYAREA | FBINFO_HWACCEL_FILLRECT |
FBINFO_HWACCEL_XPAN | FBINFO_HWACCEL_YPAN;

+#if defined(CONFIG_OF)
+#ifdef __BIG_ENDIAN
+ if (of_get_property(info->dev->parent->of_node, "little-endian", NULL))
+ fb->flags |= FBINFO_FOREIGN_ENDIAN;
+#else
+ if (of_get_property(info->dev->parent->of_node, "big-endian", NULL))
+ fb->flags |= FBINFO_FOREIGN_ENDIAN;
+#endif
+#endif
/* fixed data */

fb->fix.type = FB_TYPE_PACKED_PIXELS;
@@ -1933,8 +1942,32 @@ static int __devinit sm501fb_probe(struct platform_device *pdev)
}

if (info->pdata == NULL) {
- dev_info(dev, "using default configuration data\n");
+ int found = 0;
+#if defined(CONFIG_OF)
+ struct device_node *np = pdev->dev.parent->of_node;
+ const u8 *prop;
+ const char *cp;
+ int len;
+
info->pdata = &sm501fb_def_pdata;
+ if (np) {
+ /* Get EDID */
+ cp = of_get_property(np, "mode", &len);
+ if (cp)
+ strcpy(fb_mode, cp);
+ prop = of_get_property(np, "edid", &len);
+ if (prop && len == EDID_LENGTH) {
+ info->edid_data = kmemdup(prop, EDID_LENGTH,
+ GFP_KERNEL);
+ if (info->edid_data)
+ found = 1;
+ }
+ }
+#endif
+ if (!found) {
+ dev_info(dev, "using default configuration data\n");
+ info->pdata = &sm501fb_def_pdata;
+ }
}

/* probe for the presence of each panel */
--
1.7.4

2011-03-22 08:28:55

by Heiko Schocher

[permalink] [raw]
Subject: [PATCH v6 2/6] video, sm501: add I/O functions for use on powerpc

- add read/write functions for using this driver
also on powerpc plattforms

Signed-off-by: Heiko Schocher <[email protected]>
Acked-by: Samuel Ortiz <[email protected]>
cc: Wolfram Sang <[email protected]>
cc: Grant Likely <[email protected]>
cc: Benjamin Herrenschmidt <[email protected]>
cc: [email protected]
cc: [email protected]
cc: Ben Dooks <[email protected]>
cc: Vincent Sanders <[email protected]>
cc: Samuel Ortiz <[email protected]>
cc: [email protected]
cc: Randy Dunlap <[email protected]>
cc: Wolfgang Denk <[email protected]>
cc: Paul Mundt <[email protected]>
---
- changes since v1:
add Ben Dooks, Vincent Sanders and Samuel Ortiz to cc, as suggested from
Paul Mundt.
- changes since v2:
add comments from Randy Dunlap:
- move parameter documentation to Documentation/fb/sm501.txt
- changes since v3:
- rebased against v2.6.38-rc2
- split in 3 patches
- of support patch
- i/o routine patch
- use ioread/write32{be} accessors instead of
__do_readl/__do_writel{_be}
- edid support patch
- changes for v6:
- repost complete patchserie
- rebased against current head

drivers/mfd/sm501.c | 125 +++++++++++++++++-----------------
drivers/video/sm501fb.c | 172 ++++++++++++++++++++++++----------------------
include/linux/sm501.h | 8 ++
3 files changed, 161 insertions(+), 144 deletions(-)

diff --git a/drivers/mfd/sm501.c b/drivers/mfd/sm501.c
index 5de3a76..558d5f3 100644
--- a/drivers/mfd/sm501.c
+++ b/drivers/mfd/sm501.c
@@ -133,10 +133,10 @@ static unsigned long decode_div(unsigned long pll2, unsigned long val,

static void sm501_dump_clk(struct sm501_devdata *sm)
{
- unsigned long misct = readl(sm->regs + SM501_MISC_TIMING);
- unsigned long pm0 = readl(sm->regs + SM501_POWER_MODE_0_CLOCK);
- unsigned long pm1 = readl(sm->regs + SM501_POWER_MODE_1_CLOCK);
- unsigned long pmc = readl(sm->regs + SM501_POWER_MODE_CONTROL);
+ unsigned long misct = smc501_readl(sm->regs + SM501_MISC_TIMING);
+ unsigned long pm0 = smc501_readl(sm->regs + SM501_POWER_MODE_0_CLOCK);
+ unsigned long pm1 = smc501_readl(sm->regs + SM501_POWER_MODE_1_CLOCK);
+ unsigned long pmc = smc501_readl(sm->regs + SM501_POWER_MODE_CONTROL);
unsigned long sdclk0, sdclk1;
unsigned long pll2 = 0;

@@ -193,29 +193,29 @@ static void sm501_dump_regs(struct sm501_devdata *sm)
void __iomem *regs = sm->regs;

dev_info(sm->dev, "System Control %08x\n",
- readl(regs + SM501_SYSTEM_CONTROL));
+ smc501_readl(regs + SM501_SYSTEM_CONTROL));
dev_info(sm->dev, "Misc Control %08x\n",
- readl(regs + SM501_MISC_CONTROL));
+ smc501_readl(regs + SM501_MISC_CONTROL));
dev_info(sm->dev, "GPIO Control Low %08x\n",
- readl(regs + SM501_GPIO31_0_CONTROL));
+ smc501_readl(regs + SM501_GPIO31_0_CONTROL));
dev_info(sm->dev, "GPIO Control Hi %08x\n",
- readl(regs + SM501_GPIO63_32_CONTROL));
+ smc501_readl(regs + SM501_GPIO63_32_CONTROL));
dev_info(sm->dev, "DRAM Control %08x\n",
- readl(regs + SM501_DRAM_CONTROL));
+ smc501_readl(regs + SM501_DRAM_CONTROL));
dev_info(sm->dev, "Arbitration Ctrl %08x\n",
- readl(regs + SM501_ARBTRTN_CONTROL));
+ smc501_readl(regs + SM501_ARBTRTN_CONTROL));
dev_info(sm->dev, "Misc Timing %08x\n",
- readl(regs + SM501_MISC_TIMING));
+ smc501_readl(regs + SM501_MISC_TIMING));
}

static void sm501_dump_gate(struct sm501_devdata *sm)
{
dev_info(sm->dev, "CurrentGate %08x\n",
- readl(sm->regs + SM501_CURRENT_GATE));
+ smc501_readl(sm->regs + SM501_CURRENT_GATE));
dev_info(sm->dev, "CurrentClock %08x\n",
- readl(sm->regs + SM501_CURRENT_CLOCK));
+ smc501_readl(sm->regs + SM501_CURRENT_CLOCK));
dev_info(sm->dev, "PowerModeControl %08x\n",
- readl(sm->regs + SM501_POWER_MODE_CONTROL));
+ smc501_readl(sm->regs + SM501_POWER_MODE_CONTROL));
}

#else
@@ -231,7 +231,7 @@ static inline void sm501_dump_clk(struct sm501_devdata *sm) { }

static void sm501_sync_regs(struct sm501_devdata *sm)
{
- readl(sm->regs);
+ smc501_readl(sm->regs);
}

static inline void sm501_mdelay(struct sm501_devdata *sm, unsigned int delay)
@@ -261,11 +261,11 @@ int sm501_misc_control(struct device *dev,

spin_lock_irqsave(&sm->reg_lock, save);

- misc = readl(sm->regs + SM501_MISC_CONTROL);
+ misc = smc501_readl(sm->regs + SM501_MISC_CONTROL);
to = (misc & ~clear) | set;

if (to != misc) {
- writel(to, sm->regs + SM501_MISC_CONTROL);
+ smc501_writel(to, sm->regs + SM501_MISC_CONTROL);
sm501_sync_regs(sm);

dev_dbg(sm->dev, "MISC_CONTROL %08lx\n", misc);
@@ -294,11 +294,11 @@ unsigned long sm501_modify_reg(struct device *dev,

spin_lock_irqsave(&sm->reg_lock, save);

- data = readl(sm->regs + reg);
+ data = smc501_readl(sm->regs + reg);
data |= set;
data &= ~clear;

- writel(data, sm->regs + reg);
+ smc501_writel(data, sm->regs + reg);
sm501_sync_regs(sm);

spin_unlock_irqrestore(&sm->reg_lock, save);
@@ -322,9 +322,9 @@ int sm501_unit_power(struct device *dev, unsigned int unit, unsigned int to)

mutex_lock(&sm->clock_lock);

- mode = readl(sm->regs + SM501_POWER_MODE_CONTROL);
- gate = readl(sm->regs + SM501_CURRENT_GATE);
- clock = readl(sm->regs + SM501_CURRENT_CLOCK);
+ mode = smc501_readl(sm->regs + SM501_POWER_MODE_CONTROL);
+ gate = smc501_readl(sm->regs + SM501_CURRENT_GATE);
+ clock = smc501_readl(sm->regs + SM501_CURRENT_CLOCK);

mode &= 3; /* get current power mode */

@@ -356,14 +356,14 @@ int sm501_unit_power(struct device *dev, unsigned int unit, unsigned int to)

switch (mode) {
case 1:
- writel(gate, sm->regs + SM501_POWER_MODE_0_GATE);
- writel(clock, sm->regs + SM501_POWER_MODE_0_CLOCK);
+ smc501_writel(gate, sm->regs + SM501_POWER_MODE_0_GATE);
+ smc501_writel(clock, sm->regs + SM501_POWER_MODE_0_CLOCK);
mode = 0;
break;
case 2:
case 0:
- writel(gate, sm->regs + SM501_POWER_MODE_1_GATE);
- writel(clock, sm->regs + SM501_POWER_MODE_1_CLOCK);
+ smc501_writel(gate, sm->regs + SM501_POWER_MODE_1_GATE);
+ smc501_writel(clock, sm->regs + SM501_POWER_MODE_1_CLOCK);
mode = 1;
break;

@@ -372,7 +372,7 @@ int sm501_unit_power(struct device *dev, unsigned int unit, unsigned int to)
goto already;
}

- writel(mode, sm->regs + SM501_POWER_MODE_CONTROL);
+ smc501_writel(mode, sm->regs + SM501_POWER_MODE_CONTROL);
sm501_sync_regs(sm);

dev_dbg(sm->dev, "gate %08lx, clock %08lx, mode %08lx\n",
@@ -519,9 +519,9 @@ unsigned long sm501_set_clock(struct device *dev,
unsigned long req_freq)
{
struct sm501_devdata *sm = dev_get_drvdata(dev);
- unsigned long mode = readl(sm->regs + SM501_POWER_MODE_CONTROL);
- unsigned long gate = readl(sm->regs + SM501_CURRENT_GATE);
- unsigned long clock = readl(sm->regs + SM501_CURRENT_CLOCK);
+ unsigned long mode = smc501_readl(sm->regs + SM501_POWER_MODE_CONTROL);
+ unsigned long gate = smc501_readl(sm->regs + SM501_CURRENT_GATE);
+ unsigned long clock = smc501_readl(sm->regs + SM501_CURRENT_CLOCK);
unsigned char reg;
unsigned int pll_reg = 0;
unsigned long sm501_freq; /* the actual frequency achieved */
@@ -592,9 +592,9 @@ unsigned long sm501_set_clock(struct device *dev,

mutex_lock(&sm->clock_lock);

- mode = readl(sm->regs + SM501_POWER_MODE_CONTROL);
- gate = readl(sm->regs + SM501_CURRENT_GATE);
- clock = readl(sm->regs + SM501_CURRENT_CLOCK);
+ mode = smc501_readl(sm->regs + SM501_POWER_MODE_CONTROL);
+ gate = smc501_readl(sm->regs + SM501_CURRENT_GATE);
+ clock = smc501_readl(sm->regs + SM501_CURRENT_CLOCK);

clock = clock & ~(0xFF << clksrc);
clock |= reg<<clksrc;
@@ -603,14 +603,14 @@ unsigned long sm501_set_clock(struct device *dev,

switch (mode) {
case 1:
- writel(gate, sm->regs + SM501_POWER_MODE_0_GATE);
- writel(clock, sm->regs + SM501_POWER_MODE_0_CLOCK);
+ smc501_writel(gate, sm->regs + SM501_POWER_MODE_0_GATE);
+ smc501_writel(clock, sm->regs + SM501_POWER_MODE_0_CLOCK);
mode = 0;
break;
case 2:
case 0:
- writel(gate, sm->regs + SM501_POWER_MODE_1_GATE);
- writel(clock, sm->regs + SM501_POWER_MODE_1_CLOCK);
+ smc501_writel(gate, sm->regs + SM501_POWER_MODE_1_GATE);
+ smc501_writel(clock, sm->regs + SM501_POWER_MODE_1_CLOCK);
mode = 1;
break;

@@ -619,10 +619,11 @@ unsigned long sm501_set_clock(struct device *dev,
return -1;
}

- writel(mode, sm->regs + SM501_POWER_MODE_CONTROL);
+ smc501_writel(mode, sm->regs + SM501_POWER_MODE_CONTROL);

if (pll_reg)
- writel(pll_reg, sm->regs + SM501_PROGRAMMABLE_PLL_CONTROL);
+ smc501_writel(pll_reg,
+ sm->regs + SM501_PROGRAMMABLE_PLL_CONTROL);

sm501_sync_regs(sm);

@@ -902,7 +903,7 @@ static int sm501_gpio_get(struct gpio_chip *chip, unsigned offset)
struct sm501_gpio_chip *smgpio = to_sm501_gpio(chip);
unsigned long result;

- result = readl(smgpio->regbase + SM501_GPIO_DATA_LOW);
+ result = smc501_readl(smgpio->regbase + SM501_GPIO_DATA_LOW);
result >>= offset;

return result & 1UL;
@@ -915,13 +916,13 @@ static void sm501_gpio_ensure_gpio(struct sm501_gpio_chip *smchip,

/* check and modify if this pin is not set as gpio. */

- if (readl(smchip->control) & bit) {
+ if (smc501_readl(smchip->control) & bit) {
dev_info(sm501_gpio_to_dev(smchip->ourgpio)->dev,
"changing mode of gpio, bit %08lx\n", bit);

- ctrl = readl(smchip->control);
+ ctrl = smc501_readl(smchip->control);
ctrl &= ~bit;
- writel(ctrl, smchip->control);
+ smc501_writel(ctrl, smchip->control);

sm501_sync_regs(sm501_gpio_to_dev(smchip->ourgpio));
}
@@ -942,10 +943,10 @@ static void sm501_gpio_set(struct gpio_chip *chip, unsigned offset, int value)

spin_lock_irqsave(&smgpio->lock, save);

- val = readl(regs + SM501_GPIO_DATA_LOW) & ~bit;
+ val = smc501_readl(regs + SM501_GPIO_DATA_LOW) & ~bit;
if (value)
val |= bit;
- writel(val, regs);
+ smc501_writel(val, regs);

sm501_sync_regs(sm501_gpio_to_dev(smgpio));
sm501_gpio_ensure_gpio(smchip, bit);
@@ -967,8 +968,8 @@ static int sm501_gpio_input(struct gpio_chip *chip, unsigned offset)

spin_lock_irqsave(&smgpio->lock, save);

- ddr = readl(regs + SM501_GPIO_DDR_LOW);
- writel(ddr & ~bit, regs + SM501_GPIO_DDR_LOW);
+ ddr = smc501_readl(regs + SM501_GPIO_DDR_LOW);
+ smc501_writel(ddr & ~bit, regs + SM501_GPIO_DDR_LOW);

sm501_sync_regs(sm501_gpio_to_dev(smgpio));
sm501_gpio_ensure_gpio(smchip, bit);
@@ -994,18 +995,18 @@ static int sm501_gpio_output(struct gpio_chip *chip,

spin_lock_irqsave(&smgpio->lock, save);

- val = readl(regs + SM501_GPIO_DATA_LOW);
+ val = smc501_readl(regs + SM501_GPIO_DATA_LOW);
if (value)
val |= bit;
else
val &= ~bit;
- writel(val, regs);
+ smc501_writel(val, regs);

- ddr = readl(regs + SM501_GPIO_DDR_LOW);
- writel(ddr | bit, regs + SM501_GPIO_DDR_LOW);
+ ddr = smc501_readl(regs + SM501_GPIO_DDR_LOW);
+ smc501_writel(ddr | bit, regs + SM501_GPIO_DDR_LOW);

sm501_sync_regs(sm501_gpio_to_dev(smgpio));
- writel(val, regs + SM501_GPIO_DATA_LOW);
+ smc501_writel(val, regs + SM501_GPIO_DATA_LOW);

sm501_sync_regs(sm501_gpio_to_dev(smgpio));
spin_unlock_irqrestore(&smgpio->lock, save);
@@ -1231,7 +1232,7 @@ static ssize_t sm501_dbg_regs(struct device *dev,

for (reg = 0x00; reg < 0x70; reg += 4) {
ret = sprintf(ptr, "%08x = %08x\n",
- reg, readl(sm->regs + reg));
+ reg, smc501_readl(sm->regs + reg));
ptr += ret;
}

@@ -1255,10 +1256,10 @@ static inline void sm501_init_reg(struct sm501_devdata *sm,
{
unsigned long tmp;

- tmp = readl(sm->regs + reg);
+ tmp = smc501_readl(sm->regs + reg);
tmp &= ~r->mask;
tmp |= r->set;
- writel(tmp, sm->regs + reg);
+ smc501_writel(tmp, sm->regs + reg);
}

/* sm501_init_regs
@@ -1299,7 +1300,7 @@ static void sm501_init_regs(struct sm501_devdata *sm,

static int sm501_check_clocks(struct sm501_devdata *sm)
{
- unsigned long pwrmode = readl(sm->regs + SM501_CURRENT_CLOCK);
+ unsigned long pwrmode = smc501_readl(sm->regs + SM501_CURRENT_CLOCK);
unsigned long msrc = (pwrmode & SM501_POWERMODE_M_SRC);
unsigned long m1src = (pwrmode & SM501_POWERMODE_M1_SRC);

@@ -1334,7 +1335,7 @@ static int __devinit sm501_init_dev(struct sm501_devdata *sm)

INIT_LIST_HEAD(&sm->devices);

- devid = readl(sm->regs + SM501_DEVICEID);
+ devid = smc501_readl(sm->regs + SM501_DEVICEID);

if ((devid & SM501_DEVICEID_IDMASK) != SM501_DEVICEID_SM501) {
dev_err(sm->dev, "incorrect device id %08lx\n", devid);
@@ -1342,9 +1343,9 @@ static int __devinit sm501_init_dev(struct sm501_devdata *sm)
}

/* disable irqs */
- writel(0, sm->regs + SM501_IRQ_MASK);
+ smc501_writel(0, sm->regs + SM501_IRQ_MASK);

- dramctrl = readl(sm->regs + SM501_DRAM_CONTROL);
+ dramctrl = smc501_readl(sm->regs + SM501_DRAM_CONTROL);
mem_avail = sm501_mem_local[(dramctrl >> 13) & 0x7];

dev_info(sm->dev, "SM501 At %p: Version %08lx, %ld Mb, IRQ %d\n",
@@ -1489,7 +1490,7 @@ static int sm501_plat_suspend(struct platform_device *pdev, pm_message_t state)
struct sm501_devdata *sm = platform_get_drvdata(pdev);

sm->in_suspend = 1;
- sm->pm_misc = readl(sm->regs + SM501_MISC_CONTROL);
+ sm->pm_misc = smc501_readl(sm->regs + SM501_MISC_CONTROL);

sm501_dump_regs(sm);

@@ -1513,9 +1514,9 @@ static int sm501_plat_resume(struct platform_device *pdev)

/* check to see if we are in the same state as when suspended */

- if (readl(sm->regs + SM501_MISC_CONTROL) != sm->pm_misc) {
+ if (smc501_readl(sm->regs + SM501_MISC_CONTROL) != sm->pm_misc) {
dev_info(sm->dev, "SM501_MISC_CONTROL changed over sleep\n");
- writel(sm->pm_misc, sm->regs + SM501_MISC_CONTROL);
+ smc501_writel(sm->pm_misc, sm->regs + SM501_MISC_CONTROL);

/* our suspend causes the controller state to change,
* either by something attempting setup, power loss,
diff --git a/drivers/video/sm501fb.c b/drivers/video/sm501fb.c
index bcb44a5..5df406c 100644
--- a/drivers/video/sm501fb.c
+++ b/drivers/video/sm501fb.c
@@ -117,7 +117,7 @@ static inline int v_total(struct fb_var_screeninfo *var)

static inline void sm501fb_sync_regs(struct sm501fb_info *info)
{
- readl(info->regs);
+ smc501_readl(info->regs);
}

/* sm501_alloc_mem
@@ -262,7 +262,7 @@ static void sm501fb_setup_gamma(struct sm501fb_info *fbi,

/* set gamma values */
for (offset = 0; offset < 256 * 4; offset += 4) {
- writel(value, fbi->regs + palette + offset);
+ smc501_writel(value, fbi->regs + palette + offset);
value += 0x010101; /* Advance RGB by 1,1,1.*/
}
}
@@ -476,7 +476,8 @@ static int sm501fb_set_par_common(struct fb_info *info,

/* set start of framebuffer to the screen */

- writel(par->screen.sm_addr | SM501_ADDR_FLIP, fbi->regs + head_addr);
+ smc501_writel(par->screen.sm_addr | SM501_ADDR_FLIP,
+ fbi->regs + head_addr);

/* program CRT clock */

@@ -519,7 +520,7 @@ static void sm501fb_set_par_geometry(struct fb_info *info,
reg = info->fix.line_length;
reg |= ((var->xres * var->bits_per_pixel)/8) << 16;

- writel(reg, fbi->regs + (par->head == HEAD_CRT ?
+ smc501_writel(reg, fbi->regs + (par->head == HEAD_CRT ?
SM501_DC_CRT_FB_OFFSET : SM501_DC_PANEL_FB_OFFSET));

/* program horizontal total */
@@ -527,27 +528,27 @@ static void sm501fb_set_par_geometry(struct fb_info *info,
reg = (h_total(var) - 1) << 16;
reg |= (var->xres - 1);

- writel(reg, base + SM501_OFF_DC_H_TOT);
+ smc501_writel(reg, base + SM501_OFF_DC_H_TOT);

/* program horizontal sync */

reg = var->hsync_len << 16;
reg |= var->xres + var->right_margin - 1;

- writel(reg, base + SM501_OFF_DC_H_SYNC);
+ smc501_writel(reg, base + SM501_OFF_DC_H_SYNC);

/* program vertical total */

reg = (v_total(var) - 1) << 16;
reg |= (var->yres - 1);

- writel(reg, base + SM501_OFF_DC_V_TOT);
+ smc501_writel(reg, base + SM501_OFF_DC_V_TOT);

/* program vertical sync */
reg = var->vsync_len << 16;
reg |= var->yres + var->lower_margin - 1;

- writel(reg, base + SM501_OFF_DC_V_SYNC);
+ smc501_writel(reg, base + SM501_OFF_DC_V_SYNC);
}

/* sm501fb_pan_crt
@@ -566,15 +567,15 @@ static int sm501fb_pan_crt(struct fb_var_screeninfo *var,

xoffs = var->xoffset * bytes_pixel;

- reg = readl(fbi->regs + SM501_DC_CRT_CONTROL);
+ reg = smc501_readl(fbi->regs + SM501_DC_CRT_CONTROL);

reg &= ~SM501_DC_CRT_CONTROL_PIXEL_MASK;
reg |= ((xoffs & 15) / bytes_pixel) << 4;
- writel(reg, fbi->regs + SM501_DC_CRT_CONTROL);
+ smc501_writel(reg, fbi->regs + SM501_DC_CRT_CONTROL);

reg = (par->screen.sm_addr + xoffs +
var->yoffset * info->fix.line_length);
- writel(reg | SM501_ADDR_FLIP, fbi->regs + SM501_DC_CRT_FB_ADDR);
+ smc501_writel(reg | SM501_ADDR_FLIP, fbi->regs + SM501_DC_CRT_FB_ADDR);

sm501fb_sync_regs(fbi);
return 0;
@@ -593,10 +594,10 @@ static int sm501fb_pan_pnl(struct fb_var_screeninfo *var,
unsigned long reg;

reg = var->xoffset | (var->xres_virtual << 16);
- writel(reg, fbi->regs + SM501_DC_PANEL_FB_WIDTH);
+ smc501_writel(reg, fbi->regs + SM501_DC_PANEL_FB_WIDTH);

reg = var->yoffset | (var->yres_virtual << 16);
- writel(reg, fbi->regs + SM501_DC_PANEL_FB_HEIGHT);
+ smc501_writel(reg, fbi->regs + SM501_DC_PANEL_FB_HEIGHT);

sm501fb_sync_regs(fbi);
return 0;
@@ -622,7 +623,7 @@ static int sm501fb_set_par_crt(struct fb_info *info)
/* enable CRT DAC - note 0 is on!*/
sm501_misc_control(fbi->dev->parent, 0, SM501_MISC_DAC_POWER);

- control = readl(fbi->regs + SM501_DC_CRT_CONTROL);
+ control = smc501_readl(fbi->regs + SM501_DC_CRT_CONTROL);

control &= (SM501_DC_CRT_CONTROL_PIXEL_MASK |
SM501_DC_CRT_CONTROL_GAMMA |
@@ -684,7 +685,7 @@ static int sm501fb_set_par_crt(struct fb_info *info)
out_update:
dev_dbg(fbi->dev, "new control is %08lx\n", control);

- writel(control, fbi->regs + SM501_DC_CRT_CONTROL);
+ smc501_writel(control, fbi->regs + SM501_DC_CRT_CONTROL);
sm501fb_sync_regs(fbi);

return 0;
@@ -696,18 +697,18 @@ static void sm501fb_panel_power(struct sm501fb_info *fbi, int to)
void __iomem *ctrl_reg = fbi->regs + SM501_DC_PANEL_CONTROL;
struct sm501_platdata_fbsub *pd = fbi->pdata->fb_pnl;

- control = readl(ctrl_reg);
+ control = smc501_readl(ctrl_reg);

if (to && (control & SM501_DC_PANEL_CONTROL_VDD) == 0) {
/* enable panel power */

control |= SM501_DC_PANEL_CONTROL_VDD; /* FPVDDEN */
- writel(control, ctrl_reg);
+ smc501_writel(control, ctrl_reg);
sm501fb_sync_regs(fbi);
mdelay(10);

control |= SM501_DC_PANEL_CONTROL_DATA; /* DATA */
- writel(control, ctrl_reg);
+ smc501_writel(control, ctrl_reg);
sm501fb_sync_regs(fbi);
mdelay(10);

@@ -719,7 +720,7 @@ static void sm501fb_panel_power(struct sm501fb_info *fbi, int to)
else
control |= SM501_DC_PANEL_CONTROL_BIAS;

- writel(control, ctrl_reg);
+ smc501_writel(control, ctrl_reg);
sm501fb_sync_regs(fbi);
mdelay(10);
}
@@ -730,7 +731,7 @@ static void sm501fb_panel_power(struct sm501fb_info *fbi, int to)
else
control |= SM501_DC_PANEL_CONTROL_FPEN;

- writel(control, ctrl_reg);
+ smc501_writel(control, ctrl_reg);
sm501fb_sync_regs(fbi);
mdelay(10);
}
@@ -742,7 +743,7 @@ static void sm501fb_panel_power(struct sm501fb_info *fbi, int to)
else
control &= ~SM501_DC_PANEL_CONTROL_FPEN;

- writel(control, ctrl_reg);
+ smc501_writel(control, ctrl_reg);
sm501fb_sync_regs(fbi);
mdelay(10);
}
@@ -753,18 +754,18 @@ static void sm501fb_panel_power(struct sm501fb_info *fbi, int to)
else
control &= ~SM501_DC_PANEL_CONTROL_BIAS;

- writel(control, ctrl_reg);
+ smc501_writel(control, ctrl_reg);
sm501fb_sync_regs(fbi);
mdelay(10);
}

control &= ~SM501_DC_PANEL_CONTROL_DATA;
- writel(control, ctrl_reg);
+ smc501_writel(control, ctrl_reg);
sm501fb_sync_regs(fbi);
mdelay(10);

control &= ~SM501_DC_PANEL_CONTROL_VDD;
- writel(control, ctrl_reg);
+ smc501_writel(control, ctrl_reg);
sm501fb_sync_regs(fbi);
mdelay(10);
}
@@ -799,7 +800,7 @@ static int sm501fb_set_par_pnl(struct fb_info *info)

/* update control register */

- control = readl(fbi->regs + SM501_DC_PANEL_CONTROL);
+ control = smc501_readl(fbi->regs + SM501_DC_PANEL_CONTROL);
control &= (SM501_DC_PANEL_CONTROL_GAMMA |
SM501_DC_PANEL_CONTROL_VDD |
SM501_DC_PANEL_CONTROL_DATA |
@@ -833,16 +834,16 @@ static int sm501fb_set_par_pnl(struct fb_info *info)
BUG();
}

- writel(0x0, fbi->regs + SM501_DC_PANEL_PANNING_CONTROL);
+ smc501_writel(0x0, fbi->regs + SM501_DC_PANEL_PANNING_CONTROL);

/* panel plane top left and bottom right location */

- writel(0x00, fbi->regs + SM501_DC_PANEL_TL_LOC);
+ smc501_writel(0x00, fbi->regs + SM501_DC_PANEL_TL_LOC);

reg = var->xres - 1;
reg |= (var->yres - 1) << 16;

- writel(reg, fbi->regs + SM501_DC_PANEL_BR_LOC);
+ smc501_writel(reg, fbi->regs + SM501_DC_PANEL_BR_LOC);

/* program panel control register */

@@ -855,7 +856,7 @@ static int sm501fb_set_par_pnl(struct fb_info *info)
if ((var->sync & FB_SYNC_VERT_HIGH_ACT) == 0)
control |= SM501_DC_PANEL_CONTROL_VSP;

- writel(control, fbi->regs + SM501_DC_PANEL_CONTROL);
+ smc501_writel(control, fbi->regs + SM501_DC_PANEL_CONTROL);
sm501fb_sync_regs(fbi);

/* ensure the panel interface is not tristated at this point */
@@ -924,7 +925,7 @@ static int sm501fb_setcolreg(unsigned regno,
val |= (green >> 8) << 8;
val |= blue >> 8;

- writel(val, base + (regno * 4));
+ smc501_writel(val, base + (regno * 4));
}

break;
@@ -980,7 +981,7 @@ static int sm501fb_blank_crt(int blank_mode, struct fb_info *info)

dev_dbg(fbi->dev, "%s(mode=%d, %p)\n", __func__, blank_mode, info);

- ctrl = readl(fbi->regs + SM501_DC_CRT_CONTROL);
+ ctrl = smc501_readl(fbi->regs + SM501_DC_CRT_CONTROL);

switch (blank_mode) {
case FB_BLANK_POWERDOWN:
@@ -1004,7 +1005,7 @@ static int sm501fb_blank_crt(int blank_mode, struct fb_info *info)

}

- writel(ctrl, fbi->regs + SM501_DC_CRT_CONTROL);
+ smc501_writel(ctrl, fbi->regs + SM501_DC_CRT_CONTROL);
sm501fb_sync_regs(fbi);

return 0;
@@ -1041,12 +1042,14 @@ static int sm501fb_cursor(struct fb_info *info, struct fb_cursor *cursor)
if (cursor->image.depth > 1)
return -EINVAL;

- hwc_addr = readl(base + SM501_OFF_HWC_ADDR);
+ hwc_addr = smc501_readl(base + SM501_OFF_HWC_ADDR);

if (cursor->enable)
- writel(hwc_addr | SM501_HWC_EN, base + SM501_OFF_HWC_ADDR);
+ smc501_writel(hwc_addr | SM501_HWC_EN,
+ base + SM501_OFF_HWC_ADDR);
else
- writel(hwc_addr & ~SM501_HWC_EN, base + SM501_OFF_HWC_ADDR);
+ smc501_writel(hwc_addr & ~SM501_HWC_EN,
+ base + SM501_OFF_HWC_ADDR);

/* set data */
if (cursor->set & FB_CUR_SETPOS) {
@@ -1060,7 +1063,7 @@ static int sm501fb_cursor(struct fb_info *info, struct fb_cursor *cursor)

//y += cursor->image.height;

- writel(x | (y << 16), base + SM501_OFF_HWC_LOC);
+ smc501_writel(x | (y << 16), base + SM501_OFF_HWC_LOC);
}

if (cursor->set & FB_CUR_SETCMAP) {
@@ -1080,8 +1083,8 @@ static int sm501fb_cursor(struct fb_info *info, struct fb_cursor *cursor)

dev_dbg(fbi->dev, "fgcol %08lx, bgcol %08lx\n", fg, bg);

- writel(bg, base + SM501_OFF_HWC_COLOR_1_2);
- writel(fg, base + SM501_OFF_HWC_COLOR_3);
+ smc501_writel(bg, base + SM501_OFF_HWC_COLOR_1_2);
+ smc501_writel(fg, base + SM501_OFF_HWC_COLOR_3);
}

if (cursor->set & FB_CUR_SETSIZE ||
@@ -1102,7 +1105,7 @@ static int sm501fb_cursor(struct fb_info *info, struct fb_cursor *cursor)
__func__, cursor->image.width, cursor->image.height);

for (op = 0; op < (64*64*2)/8; op+=4)
- writel(0x0, dst + op);
+ smc501_writel(0x0, dst + op);

for (y = 0; y < cursor->image.height; y++) {
for (x = 0; x < cursor->image.width; x++) {
@@ -1141,7 +1144,7 @@ static ssize_t sm501fb_crtsrc_show(struct device *dev,
struct sm501fb_info *info = dev_get_drvdata(dev);
unsigned long ctrl;

- ctrl = readl(info->regs + SM501_DC_CRT_CONTROL);
+ ctrl = smc501_readl(info->regs + SM501_DC_CRT_CONTROL);
ctrl &= SM501_DC_CRT_CONTROL_SEL;

return snprintf(buf, PAGE_SIZE, "%s\n", ctrl ? "crt" : "panel");
@@ -1172,7 +1175,7 @@ static ssize_t sm501fb_crtsrc_store(struct device *dev,

dev_info(dev, "setting crt source to head %d\n", head);

- ctrl = readl(info->regs + SM501_DC_CRT_CONTROL);
+ ctrl = smc501_readl(info->regs + SM501_DC_CRT_CONTROL);

if (head == HEAD_CRT) {
ctrl |= SM501_DC_CRT_CONTROL_SEL;
@@ -1184,7 +1187,7 @@ static ssize_t sm501fb_crtsrc_store(struct device *dev,
ctrl &= ~SM501_DC_CRT_CONTROL_TE;
}

- writel(ctrl, info->regs + SM501_DC_CRT_CONTROL);
+ smc501_writel(ctrl, info->regs + SM501_DC_CRT_CONTROL);
sm501fb_sync_regs(info);

return len;
@@ -1205,7 +1208,8 @@ static int sm501fb_show_regs(struct sm501fb_info *info, char *ptr,
unsigned int reg;

for (reg = start; reg < (len + start); reg += 4)
- ptr += sprintf(ptr, "%08x = %08x\n", reg, readl(mem + reg));
+ ptr += sprintf(ptr, "%08x = %08x\n", reg,
+ smc501_readl(mem + reg));

return ptr - buf;
}
@@ -1257,7 +1261,7 @@ static int sm501fb_sync(struct fb_info *info)

/* wait for the 2d engine to be ready */
while ((count > 0) &&
- (readl(fbi->regs + SM501_SYSTEM_CONTROL) &
+ (smc501_readl(fbi->regs + SM501_SYSTEM_CONTROL) &
SM501_SYSCTRL_2D_ENGINE_STATUS) != 0)
count--;

@@ -1312,45 +1316,46 @@ static void sm501fb_copyarea(struct fb_info *info, const struct fb_copyarea *are
return;

/* set the base addresses */
- writel(par->screen.sm_addr, fbi->regs2d + SM501_2D_SOURCE_BASE);
- writel(par->screen.sm_addr, fbi->regs2d + SM501_2D_DESTINATION_BASE);
+ smc501_writel(par->screen.sm_addr, fbi->regs2d + SM501_2D_SOURCE_BASE);
+ smc501_writel(par->screen.sm_addr,
+ fbi->regs2d + SM501_2D_DESTINATION_BASE);

/* set the window width */
- writel((info->var.xres << 16) | info->var.xres,
+ smc501_writel((info->var.xres << 16) | info->var.xres,
fbi->regs2d + SM501_2D_WINDOW_WIDTH);

/* set window stride */
- writel((info->var.xres_virtual << 16) | info->var.xres_virtual,
+ smc501_writel((info->var.xres_virtual << 16) | info->var.xres_virtual,
fbi->regs2d + SM501_2D_PITCH);

/* set data format */
switch (info->var.bits_per_pixel) {
case 8:
- writel(0, fbi->regs2d + SM501_2D_STRETCH);
+ smc501_writel(0, fbi->regs2d + SM501_2D_STRETCH);
break;
case 16:
- writel(0x00100000, fbi->regs2d + SM501_2D_STRETCH);
+ smc501_writel(0x00100000, fbi->regs2d + SM501_2D_STRETCH);
break;
case 32:
- writel(0x00200000, fbi->regs2d + SM501_2D_STRETCH);
+ smc501_writel(0x00200000, fbi->regs2d + SM501_2D_STRETCH);
break;
}

/* 2d compare mask */
- writel(0xffffffff, fbi->regs2d + SM501_2D_COLOR_COMPARE_MASK);
+ smc501_writel(0xffffffff, fbi->regs2d + SM501_2D_COLOR_COMPARE_MASK);

/* 2d mask */
- writel(0xffffffff, fbi->regs2d + SM501_2D_MASK);
+ smc501_writel(0xffffffff, fbi->regs2d + SM501_2D_MASK);

/* source and destination x y */
- writel((sx << 16) | sy, fbi->regs2d + SM501_2D_SOURCE);
- writel((dx << 16) | dy, fbi->regs2d + SM501_2D_DESTINATION);
+ smc501_writel((sx << 16) | sy, fbi->regs2d + SM501_2D_SOURCE);
+ smc501_writel((dx << 16) | dy, fbi->regs2d + SM501_2D_DESTINATION);

/* w/h */
- writel((width << 16) | height, fbi->regs2d + SM501_2D_DIMENSION);
+ smc501_writel((width << 16) | height, fbi->regs2d + SM501_2D_DIMENSION);

/* do area move */
- writel(0x800000cc | rtl, fbi->regs2d + SM501_2D_CONTROL);
+ smc501_writel(0x800000cc | rtl, fbi->regs2d + SM501_2D_CONTROL);
}

static void sm501fb_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
@@ -1372,47 +1377,49 @@ static void sm501fb_fillrect(struct fb_info *info, const struct fb_fillrect *rec
return;

/* set the base addresses */
- writel(par->screen.sm_addr, fbi->regs2d + SM501_2D_SOURCE_BASE);
- writel(par->screen.sm_addr, fbi->regs2d + SM501_2D_DESTINATION_BASE);
+ smc501_writel(par->screen.sm_addr, fbi->regs2d + SM501_2D_SOURCE_BASE);
+ smc501_writel(par->screen.sm_addr,
+ fbi->regs2d + SM501_2D_DESTINATION_BASE);

/* set the window width */
- writel((info->var.xres << 16) | info->var.xres,
+ smc501_writel((info->var.xres << 16) | info->var.xres,
fbi->regs2d + SM501_2D_WINDOW_WIDTH);

/* set window stride */
- writel((info->var.xres_virtual << 16) | info->var.xres_virtual,
+ smc501_writel((info->var.xres_virtual << 16) | info->var.xres_virtual,
fbi->regs2d + SM501_2D_PITCH);

/* set data format */
switch (info->var.bits_per_pixel) {
case 8:
- writel(0, fbi->regs2d + SM501_2D_STRETCH);
+ smc501_writel(0, fbi->regs2d + SM501_2D_STRETCH);
break;
case 16:
- writel(0x00100000, fbi->regs2d + SM501_2D_STRETCH);
+ smc501_writel(0x00100000, fbi->regs2d + SM501_2D_STRETCH);
break;
case 32:
- writel(0x00200000, fbi->regs2d + SM501_2D_STRETCH);
+ smc501_writel(0x00200000, fbi->regs2d + SM501_2D_STRETCH);
break;
}

/* 2d compare mask */
- writel(0xffffffff, fbi->regs2d + SM501_2D_COLOR_COMPARE_MASK);
+ smc501_writel(0xffffffff, fbi->regs2d + SM501_2D_COLOR_COMPARE_MASK);

/* 2d mask */
- writel(0xffffffff, fbi->regs2d + SM501_2D_MASK);
+ smc501_writel(0xffffffff, fbi->regs2d + SM501_2D_MASK);

/* colour */
- writel(rect->color, fbi->regs2d + SM501_2D_FOREGROUND);
+ smc501_writel(rect->color, fbi->regs2d + SM501_2D_FOREGROUND);

/* x y */
- writel((rect->dx << 16) | rect->dy, fbi->regs2d + SM501_2D_DESTINATION);
+ smc501_writel((rect->dx << 16) | rect->dy,
+ fbi->regs2d + SM501_2D_DESTINATION);

/* w/h */
- writel((width << 16) | height, fbi->regs2d + SM501_2D_DIMENSION);
+ smc501_writel((width << 16) | height, fbi->regs2d + SM501_2D_DIMENSION);

/* do rectangle fill */
- writel(0x800100cc, fbi->regs2d + SM501_2D_CONTROL);
+ smc501_writel(0x800100cc, fbi->regs2d + SM501_2D_CONTROL);
}


@@ -1470,11 +1477,12 @@ static int sm501_init_cursor(struct fb_info *fbi, unsigned int reg_base)

/* initialise the colour registers */

- writel(par->cursor.sm_addr, par->cursor_regs + SM501_OFF_HWC_ADDR);
+ smc501_writel(par->cursor.sm_addr,
+ par->cursor_regs + SM501_OFF_HWC_ADDR);

- writel(0x00, par->cursor_regs + SM501_OFF_HWC_LOC);
- writel(0x00, par->cursor_regs + SM501_OFF_HWC_COLOR_1_2);
- writel(0x00, par->cursor_regs + SM501_OFF_HWC_COLOR_3);
+ smc501_writel(0x00, par->cursor_regs + SM501_OFF_HWC_LOC);
+ smc501_writel(0x00, par->cursor_regs + SM501_OFF_HWC_COLOR_1_2);
+ smc501_writel(0x00, par->cursor_regs + SM501_OFF_HWC_COLOR_3);
sm501fb_sync_regs(info);

return 0;
@@ -1581,7 +1589,7 @@ static int sm501fb_start(struct sm501fb_info *info,

/* clear palette ram - undefined at power on */
for (k = 0; k < (256 * 3); k++)
- writel(0, info->regs + SM501_DC_PANEL_PALETTE + (k * 4));
+ smc501_writel(0, info->regs + SM501_DC_PANEL_PALETTE + (k * 4));

/* enable display controller */
sm501_unit_power(dev->parent, SM501_GATE_DISPLAY, 1);
@@ -1649,20 +1657,20 @@ static int sm501fb_init_fb(struct fb_info *fb,
switch (head) {
case HEAD_CRT:
pd = info->pdata->fb_crt;
- ctrl = readl(info->regs + SM501_DC_CRT_CONTROL);
+ ctrl = smc501_readl(info->regs + SM501_DC_CRT_CONTROL);
enable = (ctrl & SM501_DC_CRT_CONTROL_ENABLE) ? 1 : 0;

/* ensure we set the correct source register */
if (info->pdata->fb_route != SM501_FB_CRT_PANEL) {
ctrl |= SM501_DC_CRT_CONTROL_SEL;
- writel(ctrl, info->regs + SM501_DC_CRT_CONTROL);
+ smc501_writel(ctrl, info->regs + SM501_DC_CRT_CONTROL);
}

break;

case HEAD_PANEL:
pd = info->pdata->fb_pnl;
- ctrl = readl(info->regs + SM501_DC_PANEL_CONTROL);
+ ctrl = smc501_readl(info->regs + SM501_DC_PANEL_CONTROL);
enable = (ctrl & SM501_DC_PANEL_CONTROL_EN) ? 1 : 0;
break;

@@ -1680,7 +1688,7 @@ static int sm501fb_init_fb(struct fb_info *fb,

if (head == HEAD_CRT && info->pdata->fb_route == SM501_FB_CRT_PANEL) {
ctrl &= ~SM501_DC_CRT_CONTROL_SEL;
- writel(ctrl, info->regs + SM501_DC_CRT_CONTROL);
+ smc501_writel(ctrl, info->regs + SM501_DC_CRT_CONTROL);
enable = 0;
}

@@ -2085,7 +2093,7 @@ static int sm501fb_suspend(struct platform_device *pdev, pm_message_t state)
struct sm501fb_info *info = platform_get_drvdata(pdev);

/* store crt control to resume with */
- info->pm_crt_ctrl = readl(info->regs + SM501_DC_CRT_CONTROL);
+ info->pm_crt_ctrl = smc501_readl(info->regs + SM501_DC_CRT_CONTROL);

sm501fb_suspend_fb(info, HEAD_CRT);
sm501fb_suspend_fb(info, HEAD_PANEL);
@@ -2109,10 +2117,10 @@ static int sm501fb_resume(struct platform_device *pdev)

/* restore the items we want to be saved for crt control */

- crt_ctrl = readl(info->regs + SM501_DC_CRT_CONTROL);
+ crt_ctrl = smc501_readl(info->regs + SM501_DC_CRT_CONTROL);
crt_ctrl &= ~SM501_CRT_CTRL_SAVE;
crt_ctrl |= info->pm_crt_ctrl & SM501_CRT_CTRL_SAVE;
- writel(crt_ctrl, info->regs + SM501_DC_CRT_CONTROL);
+ smc501_writel(crt_ctrl, info->regs + SM501_DC_CRT_CONTROL);

sm501fb_resume_fb(info, HEAD_CRT);
sm501fb_resume_fb(info, HEAD_PANEL);
diff --git a/include/linux/sm501.h b/include/linux/sm501.h
index 214f932..02fde50 100644
--- a/include/linux/sm501.h
+++ b/include/linux/sm501.h
@@ -172,3 +172,11 @@ struct sm501_platdata {
struct sm501_platdata_gpio_i2c *gpio_i2c;
unsigned int gpio_i2c_nr;
};
+
+#if defined(CONFIG_PPC32)
+#define smc501_readl(addr) ioread32be((addr))
+#define smc501_writel(val, addr) iowrite32be((val), (addr))
+#else
+#define smc501_readl(addr) readl(addr)
+#define smc501_writel(val, addr) writel(val, addr)
+#endif
--
1.7.4

2011-03-22 08:28:58

by Heiko Schocher

[permalink] [raw]
Subject: [PATCH v6 3/6] video, sm501: add edid and commandline support

- add commandline options:
sm501fb.mode:
Specify resolution as "<xres>x<yres>[-<bpp>][@<refresh>]"
sm501fb.bpp:
Specify bit-per-pixel if not specified mode

- Add support for encoding display mode information
in the device tree using verbatim EDID block.

If the "edid" entry in the "smi,sm501" node is present,
the driver will build mode database using EDID data
and allow setting the display modes from this database.

Signed-off-by: Heiko Schocher <[email protected]>
cc: Wolfram Sang <[email protected]>
cc: Grant Likely <[email protected]>
cc: Benjamin Herrenschmidt <[email protected]>
cc: [email protected]
cc: [email protected]
cc: Ben Dooks <[email protected]>
cc: Vincent Sanders <[email protected]>
cc: Samuel Ortiz <[email protected]>
cc: [email protected]
cc: Randy Dunlap <[email protected]>
cc: Wolfgang Denk <[email protected]>
cc: Paul Mundt <[email protected]>
---
- changes since v1:
add Ben Dooks, Vincent Sanders and Samuel Ortiz to cc, as suggested from
Paul Mundt.
- changes since v2:
add comments from Randy Dunlap:
- move parameter documentation to Documentation/fb/sm501.txt
- changes since v3:
- rebased against v2.6.38-rc2
- split in 3 patches
- of support patch
- i/o routine patch
- edid support patch
- changes since v4:
- add "info->pdata = &sm501fb_def_pdata;" in sm501fb_probe()
as Paul Mundt suggested (and I wrongly deleted)
- move kfree(info->edid_data); to patch 3/4
as edid_data is only allocated in the CONFIG_OF case
- changes for v6:
- repost complete patchserie
- rebased against current head

Documentation/fb/sm501.txt | 10 +++++++
drivers/video/sm501fb.c | 65 ++++++++++++++++++++++++++++++++++++++++---
2 files changed, 70 insertions(+), 5 deletions(-)
create mode 100644 Documentation/fb/sm501.txt

diff --git a/Documentation/fb/sm501.txt b/Documentation/fb/sm501.txt
new file mode 100644
index 0000000..8d17aeb
--- /dev/null
+++ b/Documentation/fb/sm501.txt
@@ -0,0 +1,10 @@
+Configuration:
+
+You can pass the following kernel command line options to sm501 videoframebuffer:
+
+ sm501fb.bpp= SM501 Display driver:
+ Specifiy bits-per-pixel if not specified by 'mode'
+
+ sm501fb.mode= SM501 Display driver:
+ Specify resolution as
+ "<xres>x<yres>[-<bpp>][@<refresh>]"
diff --git a/drivers/video/sm501fb.c b/drivers/video/sm501fb.c
index 5df406c..f31252c 100644
--- a/drivers/video/sm501fb.c
+++ b/drivers/video/sm501fb.c
@@ -41,6 +41,26 @@
#include <linux/sm501.h>
#include <linux/sm501-regs.h>

+#include "edid.h"
+
+static char *fb_mode = "640x480-16@60";
+static unsigned long default_bpp = 16;
+
+static struct fb_videomode __devinitdata sm501_default_mode = {
+ .refresh = 60,
+ .xres = 640,
+ .yres = 480,
+ .pixclock = 20833,
+ .left_margin = 142,
+ .right_margin = 13,
+ .upper_margin = 21,
+ .lower_margin = 1,
+ .hsync_len = 69,
+ .vsync_len = 3,
+ .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+ .vmode = FB_VMODE_NONINTERLACED
+};
+
#define NR_PALETTE 256

enum sm501_controller {
@@ -77,6 +97,7 @@ struct sm501fb_info {
void __iomem *regs2d; /* 2d remapped registers */
void __iomem *fbmem; /* remapped framebuffer */
size_t fbmem_len; /* length of remapped region */
+ u8 *edid_data;
};

/* per-framebuffer private data */
@@ -1725,9 +1746,16 @@ static int sm501fb_init_fb(struct fb_info *fb,
fb->var.vmode = FB_VMODE_NONINTERLACED;
fb->var.bits_per_pixel = 16;

+ if (info->edid_data) {
+ /* Now build modedb from EDID */
+ fb_edid_to_monspecs(info->edid_data, &fb->monspecs);
+ fb_videomode_to_modelist(fb->monspecs.modedb,
+ fb->monspecs.modedb_len,
+ &fb->modelist);
+ }
+
if (enable && (pd->flags & SM501FB_FLAG_USE_INIT_MODE) && 0) {
/* TODO read the mode from the current display */
-
} else {
if (pd->def_mode) {
dev_info(info->dev, "using supplied mode\n");
@@ -1737,12 +1765,34 @@ static int sm501fb_init_fb(struct fb_info *fb,
fb->var.xres_virtual = fb->var.xres;
fb->var.yres_virtual = fb->var.yres;
} else {
- ret = fb_find_mode(&fb->var, fb,
+ if (info->edid_data)
+ ret = fb_find_mode(&fb->var, fb, fb_mode,
+ fb->monspecs.modedb,
+ fb->monspecs.modedb_len,
+ &sm501_default_mode, default_bpp);
+ else
+ ret = fb_find_mode(&fb->var, fb,
NULL, NULL, 0, NULL, 8);

- if (ret == 0 || ret == 4) {
- dev_err(info->dev,
- "failed to get initial mode\n");
+ switch (ret) {
+ case 1:
+ dev_info(info->dev, "using mode specified in "
+ "@mode\n");
+ break;
+ case 2:
+ dev_info(info->dev, "using mode specified in "
+ "@mode with ignored refresh rate\n");
+ break;
+ case 3:
+ dev_info(info->dev, "using mode default "
+ "mode\n");
+ break;
+ case 4:
+ dev_info(info->dev, "using mode from list\n");
+ break;
+ default:
+ dev_info(info->dev, "ret = %d\n", ret);
+ dev_info(info->dev, "failed to find mode\n");
return -EINVAL;
}
}
@@ -2157,6 +2207,11 @@ static void __exit sm501fb_cleanup(void)
module_init(sm501fb_init);
module_exit(sm501fb_cleanup);

+module_param_named(mode, fb_mode, charp, 0);
+MODULE_PARM_DESC(mode,
+ "Specify resolution as \"<xres>x<yres>[-<bpp>][@<refresh>]\" ");
+module_param_named(bpp, default_bpp, ulong, 0);
+MODULE_PARM_DESC(bpp, "Specify bit-per-pixel if not specified mode");
MODULE_AUTHOR("Ben Dooks, Vincent Sanders");
MODULE_DESCRIPTION("SM501 Framebuffer driver");
MODULE_LICENSE("GPL v2");
--
1.7.4

2011-03-22 09:06:53

by Wolfram Sang

[permalink] [raw]
Subject: Re: [PATCH v1 1/6] powerpc, 5200: add support for charon board

On Tue, Mar 22, 2011 at 09:27:27AM +0100, Heiko Schocher wrote:
> Signed-off-by: Heiko Schocher <[email protected]>
> Acked-by: Benjamin Herrenschmidt <[email protected]>
> cc: Wolfram Sang <[email protected]>
> cc: Grant Likely <[email protected]>
> cc: Benjamin Herrenschmidt <[email protected]>
> cc: [email protected]
> cc: [email protected]
> cc: Ben Dooks <[email protected]>
> cc: Vincent Sanders <[email protected]>
> cc: Samuel Ortiz <[email protected]>
> cc: [email protected]
> cc: Randy Dunlap <[email protected]>
> cc: Wolfgang Denk <[email protected]>
> cc: Paul Mundt <[email protected]>
> ---
> - changes since v1:
> add comments from Wolfram Sang
> - no defconfig file
> - comment corrected in DTS
> - boardlist sorted alphabetically
> - commit log without boardinfo
> - changes for v6:
> - rebased against current head
> - repost complete patchserie
> - added Acked-by from Benjamin Herrenschmidt
>
> arch/powerpc/boot/dts/charon.dts | 226 ++++++++++++++++++++++++++
> arch/powerpc/platforms/52xx/mpc5200_simple.c | 1 +
> 2 files changed, 227 insertions(+), 0 deletions(-)
> create mode 100644 arch/powerpc/boot/dts/charon.dts

AFAICR all my concerns have been addressed, so

Acked-by: Wolfram Sang <[email protected]>

--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |


Attachments:
(No filename) (1.45 kB)
signature.asc (198.00 B)
Digital signature
Download all attachments

2011-03-22 09:10:40

by Wolfram Sang

[permalink] [raw]
Subject: Re: [PATCH v6 6/6] powerpc, tqm5200: update tqm5200_defconfig to fit for charon board.

> As this board is tqm5200 based, added necessary changes
> to the tqm5200_defconfig. In previous patchserie I added
> the changes to mpc5200_defconfig, as Wolfram Sang mentioned,
> but as tqm5200_defconfig is in mainline, and the board is
> tqm5200 based, I think, thats the appropriate place, as

I'd think the perfect solution would have been to merge the
tqm-defconfig into the mpc5200-defconfig entirely and get rid of it.
That being said, I don't think this issue is big enough to block this
series, so fine enough with me.

--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |


Attachments:
(No filename) (705.00 B)
signature.asc (198.00 B)
Digital signature
Download all attachments

2011-03-22 20:58:33

by Grant Likely

[permalink] [raw]
Subject: Re: [PATCH v6 0/6] powerpc, 52xx: add charon board support

On Tue, Mar 22, 2011 at 2:27 AM, Heiko Schocher <[email protected]> wrote:
> cc: Wolfram Sang <[email protected]>
> cc: Grant Likely <[email protected]>
> cc: Benjamin Herrenschmidt <[email protected]>
> cc: [email protected]
> cc: [email protected]
> cc: Ben Dooks <[email protected]>
> cc: Vincent Sanders <[email protected]>
> cc: Samuel Ortiz <[email protected]>
> cc: [email protected]
> cc: Randy Dunlap <[email protected]>
> cc: Wolfgang Denk <[email protected]>
> cc: Paul Mundt <[email protected]>
>
> changes since v5:
> - repost complete patchseries, as Paul Mundt suggested
> - rebased against current head
> - add Acked-by from Samuel Ortiz (MFD parts)
> ?http://www.spinics.net/lists/linux-fbdev/msg02550.html
> ?http://linux.derkeiler.com/Mailing-Lists/Kernel/2011-01/msg11798.html
>
> ?and Benjamin Herrenschmidt (DTS parts)
> ?http://lists.ozlabs.org/pipermail/linuxppc-dev/2011-February/088279.html
> - removed patch
> ?"powerpc, mpc5200: update mpc5200_defconfig to fit for charon board."
> ?therefore added
> ?"powerpc, tqm5200: update tqm5200_defconfig to fit for charon board."

Why? As Wolfram mentioned, I'd rather see mpc5200 defconfig used.
Eventually I'd like to remove tqm5200_defconfig

I'll look through the rest of the patches soon.

g.

2011-05-02 22:14:11

by Grant Likely

[permalink] [raw]
Subject: Re: [PATCH v6 0/6] powerpc, 52xx: add charon board support

On Tue, Mar 22, 2011 at 09:27:26AM +0100, Heiko Schocher wrote:
> cc: Wolfram Sang <[email protected]>
> cc: Grant Likely <[email protected]>
> cc: Benjamin Herrenschmidt <[email protected]>
> cc: [email protected]
> cc: [email protected]
> cc: Ben Dooks <[email protected]>
> cc: Vincent Sanders <[email protected]>
> cc: Samuel Ortiz <[email protected]>
> cc: [email protected]
> cc: Randy Dunlap <[email protected]>
> cc: Wolfgang Denk <[email protected]>
> cc: Paul Mundt <[email protected]>
>
> changes since v5:
> - repost complete patchseries, as Paul Mundt suggested
> - rebased against current head
> - add Acked-by from Samuel Ortiz (MFD parts)
> http://www.spinics.net/lists/linux-fbdev/msg02550.html
> http://linux.derkeiler.com/Mailing-Lists/Kernel/2011-01/msg11798.html
>
> and Benjamin Herrenschmidt (DTS parts)
> http://lists.ozlabs.org/pipermail/linuxppc-dev/2011-February/088279.html
> - removed patch
> "powerpc, mpc5200: update mpc5200_defconfig to fit for charon board."
> therefore added
> "powerpc, tqm5200: update tqm5200_defconfig to fit for charon board."

Refresh my memory, why was the mpc5200_defconfig updated dropped?

g.

2011-05-02 22:24:28

by Grant Likely

[permalink] [raw]
Subject: Re: [PATCH v6 2/6] video, sm501: add I/O functions for use on powerpc

On Tue, Mar 22, 2011 at 09:27:28AM +0100, Heiko Schocher wrote:
> - add read/write functions for using this driver
> also on powerpc plattforms
>
> Signed-off-by: Heiko Schocher <[email protected]>
> Acked-by: Samuel Ortiz <[email protected]>

Merged, thanks.

g.

> cc: Wolfram Sang <[email protected]>
> cc: Grant Likely <[email protected]>
> cc: Benjamin Herrenschmidt <[email protected]>
> cc: [email protected]
> cc: [email protected]
> cc: Ben Dooks <[email protected]>
> cc: Vincent Sanders <[email protected]>
> cc: Samuel Ortiz <[email protected]>
> cc: [email protected]
> cc: Randy Dunlap <[email protected]>
> cc: Wolfgang Denk <[email protected]>
> cc: Paul Mundt <[email protected]>
> ---
> - changes since v1:
> add Ben Dooks, Vincent Sanders and Samuel Ortiz to cc, as suggested from
> Paul Mundt.
> - changes since v2:
> add comments from Randy Dunlap:
> - move parameter documentation to Documentation/fb/sm501.txt
> - changes since v3:
> - rebased against v2.6.38-rc2
> - split in 3 patches
> - of support patch
> - i/o routine patch
> - use ioread/write32{be} accessors instead of
> __do_readl/__do_writel{_be}
> - edid support patch
> - changes for v6:
> - repost complete patchserie
> - rebased against current head
>
> drivers/mfd/sm501.c | 125 +++++++++++++++++-----------------
> drivers/video/sm501fb.c | 172 ++++++++++++++++++++++++----------------------
> include/linux/sm501.h | 8 ++
> 3 files changed, 161 insertions(+), 144 deletions(-)
>
> diff --git a/drivers/mfd/sm501.c b/drivers/mfd/sm501.c
> index 5de3a76..558d5f3 100644
> --- a/drivers/mfd/sm501.c
> +++ b/drivers/mfd/sm501.c
> @@ -133,10 +133,10 @@ static unsigned long decode_div(unsigned long pll2, unsigned long val,
>
> static void sm501_dump_clk(struct sm501_devdata *sm)
> {
> - unsigned long misct = readl(sm->regs + SM501_MISC_TIMING);
> - unsigned long pm0 = readl(sm->regs + SM501_POWER_MODE_0_CLOCK);
> - unsigned long pm1 = readl(sm->regs + SM501_POWER_MODE_1_CLOCK);
> - unsigned long pmc = readl(sm->regs + SM501_POWER_MODE_CONTROL);
> + unsigned long misct = smc501_readl(sm->regs + SM501_MISC_TIMING);
> + unsigned long pm0 = smc501_readl(sm->regs + SM501_POWER_MODE_0_CLOCK);
> + unsigned long pm1 = smc501_readl(sm->regs + SM501_POWER_MODE_1_CLOCK);
> + unsigned long pmc = smc501_readl(sm->regs + SM501_POWER_MODE_CONTROL);
> unsigned long sdclk0, sdclk1;
> unsigned long pll2 = 0;
>
> @@ -193,29 +193,29 @@ static void sm501_dump_regs(struct sm501_devdata *sm)
> void __iomem *regs = sm->regs;
>
> dev_info(sm->dev, "System Control %08x\n",
> - readl(regs + SM501_SYSTEM_CONTROL));
> + smc501_readl(regs + SM501_SYSTEM_CONTROL));
> dev_info(sm->dev, "Misc Control %08x\n",
> - readl(regs + SM501_MISC_CONTROL));
> + smc501_readl(regs + SM501_MISC_CONTROL));
> dev_info(sm->dev, "GPIO Control Low %08x\n",
> - readl(regs + SM501_GPIO31_0_CONTROL));
> + smc501_readl(regs + SM501_GPIO31_0_CONTROL));
> dev_info(sm->dev, "GPIO Control Hi %08x\n",
> - readl(regs + SM501_GPIO63_32_CONTROL));
> + smc501_readl(regs + SM501_GPIO63_32_CONTROL));
> dev_info(sm->dev, "DRAM Control %08x\n",
> - readl(regs + SM501_DRAM_CONTROL));
> + smc501_readl(regs + SM501_DRAM_CONTROL));
> dev_info(sm->dev, "Arbitration Ctrl %08x\n",
> - readl(regs + SM501_ARBTRTN_CONTROL));
> + smc501_readl(regs + SM501_ARBTRTN_CONTROL));
> dev_info(sm->dev, "Misc Timing %08x\n",
> - readl(regs + SM501_MISC_TIMING));
> + smc501_readl(regs + SM501_MISC_TIMING));
> }
>
> static void sm501_dump_gate(struct sm501_devdata *sm)
> {
> dev_info(sm->dev, "CurrentGate %08x\n",
> - readl(sm->regs + SM501_CURRENT_GATE));
> + smc501_readl(sm->regs + SM501_CURRENT_GATE));
> dev_info(sm->dev, "CurrentClock %08x\n",
> - readl(sm->regs + SM501_CURRENT_CLOCK));
> + smc501_readl(sm->regs + SM501_CURRENT_CLOCK));
> dev_info(sm->dev, "PowerModeControl %08x\n",
> - readl(sm->regs + SM501_POWER_MODE_CONTROL));
> + smc501_readl(sm->regs + SM501_POWER_MODE_CONTROL));
> }
>
> #else
> @@ -231,7 +231,7 @@ static inline void sm501_dump_clk(struct sm501_devdata *sm) { }
>
> static void sm501_sync_regs(struct sm501_devdata *sm)
> {
> - readl(sm->regs);
> + smc501_readl(sm->regs);
> }
>
> static inline void sm501_mdelay(struct sm501_devdata *sm, unsigned int delay)
> @@ -261,11 +261,11 @@ int sm501_misc_control(struct device *dev,
>
> spin_lock_irqsave(&sm->reg_lock, save);
>
> - misc = readl(sm->regs + SM501_MISC_CONTROL);
> + misc = smc501_readl(sm->regs + SM501_MISC_CONTROL);
> to = (misc & ~clear) | set;
>
> if (to != misc) {
> - writel(to, sm->regs + SM501_MISC_CONTROL);
> + smc501_writel(to, sm->regs + SM501_MISC_CONTROL);
> sm501_sync_regs(sm);
>
> dev_dbg(sm->dev, "MISC_CONTROL %08lx\n", misc);
> @@ -294,11 +294,11 @@ unsigned long sm501_modify_reg(struct device *dev,
>
> spin_lock_irqsave(&sm->reg_lock, save);
>
> - data = readl(sm->regs + reg);
> + data = smc501_readl(sm->regs + reg);
> data |= set;
> data &= ~clear;
>
> - writel(data, sm->regs + reg);
> + smc501_writel(data, sm->regs + reg);
> sm501_sync_regs(sm);
>
> spin_unlock_irqrestore(&sm->reg_lock, save);
> @@ -322,9 +322,9 @@ int sm501_unit_power(struct device *dev, unsigned int unit, unsigned int to)
>
> mutex_lock(&sm->clock_lock);
>
> - mode = readl(sm->regs + SM501_POWER_MODE_CONTROL);
> - gate = readl(sm->regs + SM501_CURRENT_GATE);
> - clock = readl(sm->regs + SM501_CURRENT_CLOCK);
> + mode = smc501_readl(sm->regs + SM501_POWER_MODE_CONTROL);
> + gate = smc501_readl(sm->regs + SM501_CURRENT_GATE);
> + clock = smc501_readl(sm->regs + SM501_CURRENT_CLOCK);
>
> mode &= 3; /* get current power mode */
>
> @@ -356,14 +356,14 @@ int sm501_unit_power(struct device *dev, unsigned int unit, unsigned int to)
>
> switch (mode) {
> case 1:
> - writel(gate, sm->regs + SM501_POWER_MODE_0_GATE);
> - writel(clock, sm->regs + SM501_POWER_MODE_0_CLOCK);
> + smc501_writel(gate, sm->regs + SM501_POWER_MODE_0_GATE);
> + smc501_writel(clock, sm->regs + SM501_POWER_MODE_0_CLOCK);
> mode = 0;
> break;
> case 2:
> case 0:
> - writel(gate, sm->regs + SM501_POWER_MODE_1_GATE);
> - writel(clock, sm->regs + SM501_POWER_MODE_1_CLOCK);
> + smc501_writel(gate, sm->regs + SM501_POWER_MODE_1_GATE);
> + smc501_writel(clock, sm->regs + SM501_POWER_MODE_1_CLOCK);
> mode = 1;
> break;
>
> @@ -372,7 +372,7 @@ int sm501_unit_power(struct device *dev, unsigned int unit, unsigned int to)
> goto already;
> }
>
> - writel(mode, sm->regs + SM501_POWER_MODE_CONTROL);
> + smc501_writel(mode, sm->regs + SM501_POWER_MODE_CONTROL);
> sm501_sync_regs(sm);
>
> dev_dbg(sm->dev, "gate %08lx, clock %08lx, mode %08lx\n",
> @@ -519,9 +519,9 @@ unsigned long sm501_set_clock(struct device *dev,
> unsigned long req_freq)
> {
> struct sm501_devdata *sm = dev_get_drvdata(dev);
> - unsigned long mode = readl(sm->regs + SM501_POWER_MODE_CONTROL);
> - unsigned long gate = readl(sm->regs + SM501_CURRENT_GATE);
> - unsigned long clock = readl(sm->regs + SM501_CURRENT_CLOCK);
> + unsigned long mode = smc501_readl(sm->regs + SM501_POWER_MODE_CONTROL);
> + unsigned long gate = smc501_readl(sm->regs + SM501_CURRENT_GATE);
> + unsigned long clock = smc501_readl(sm->regs + SM501_CURRENT_CLOCK);
> unsigned char reg;
> unsigned int pll_reg = 0;
> unsigned long sm501_freq; /* the actual frequency achieved */
> @@ -592,9 +592,9 @@ unsigned long sm501_set_clock(struct device *dev,
>
> mutex_lock(&sm->clock_lock);
>
> - mode = readl(sm->regs + SM501_POWER_MODE_CONTROL);
> - gate = readl(sm->regs + SM501_CURRENT_GATE);
> - clock = readl(sm->regs + SM501_CURRENT_CLOCK);
> + mode = smc501_readl(sm->regs + SM501_POWER_MODE_CONTROL);
> + gate = smc501_readl(sm->regs + SM501_CURRENT_GATE);
> + clock = smc501_readl(sm->regs + SM501_CURRENT_CLOCK);
>
> clock = clock & ~(0xFF << clksrc);
> clock |= reg<<clksrc;
> @@ -603,14 +603,14 @@ unsigned long sm501_set_clock(struct device *dev,
>
> switch (mode) {
> case 1:
> - writel(gate, sm->regs + SM501_POWER_MODE_0_GATE);
> - writel(clock, sm->regs + SM501_POWER_MODE_0_CLOCK);
> + smc501_writel(gate, sm->regs + SM501_POWER_MODE_0_GATE);
> + smc501_writel(clock, sm->regs + SM501_POWER_MODE_0_CLOCK);
> mode = 0;
> break;
> case 2:
> case 0:
> - writel(gate, sm->regs + SM501_POWER_MODE_1_GATE);
> - writel(clock, sm->regs + SM501_POWER_MODE_1_CLOCK);
> + smc501_writel(gate, sm->regs + SM501_POWER_MODE_1_GATE);
> + smc501_writel(clock, sm->regs + SM501_POWER_MODE_1_CLOCK);
> mode = 1;
> break;
>
> @@ -619,10 +619,11 @@ unsigned long sm501_set_clock(struct device *dev,
> return -1;
> }
>
> - writel(mode, sm->regs + SM501_POWER_MODE_CONTROL);
> + smc501_writel(mode, sm->regs + SM501_POWER_MODE_CONTROL);
>
> if (pll_reg)
> - writel(pll_reg, sm->regs + SM501_PROGRAMMABLE_PLL_CONTROL);
> + smc501_writel(pll_reg,
> + sm->regs + SM501_PROGRAMMABLE_PLL_CONTROL);
>
> sm501_sync_regs(sm);
>
> @@ -902,7 +903,7 @@ static int sm501_gpio_get(struct gpio_chip *chip, unsigned offset)
> struct sm501_gpio_chip *smgpio = to_sm501_gpio(chip);
> unsigned long result;
>
> - result = readl(smgpio->regbase + SM501_GPIO_DATA_LOW);
> + result = smc501_readl(smgpio->regbase + SM501_GPIO_DATA_LOW);
> result >>= offset;
>
> return result & 1UL;
> @@ -915,13 +916,13 @@ static void sm501_gpio_ensure_gpio(struct sm501_gpio_chip *smchip,
>
> /* check and modify if this pin is not set as gpio. */
>
> - if (readl(smchip->control) & bit) {
> + if (smc501_readl(smchip->control) & bit) {
> dev_info(sm501_gpio_to_dev(smchip->ourgpio)->dev,
> "changing mode of gpio, bit %08lx\n", bit);
>
> - ctrl = readl(smchip->control);
> + ctrl = smc501_readl(smchip->control);
> ctrl &= ~bit;
> - writel(ctrl, smchip->control);
> + smc501_writel(ctrl, smchip->control);
>
> sm501_sync_regs(sm501_gpio_to_dev(smchip->ourgpio));
> }
> @@ -942,10 +943,10 @@ static void sm501_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
>
> spin_lock_irqsave(&smgpio->lock, save);
>
> - val = readl(regs + SM501_GPIO_DATA_LOW) & ~bit;
> + val = smc501_readl(regs + SM501_GPIO_DATA_LOW) & ~bit;
> if (value)
> val |= bit;
> - writel(val, regs);
> + smc501_writel(val, regs);
>
> sm501_sync_regs(sm501_gpio_to_dev(smgpio));
> sm501_gpio_ensure_gpio(smchip, bit);
> @@ -967,8 +968,8 @@ static int sm501_gpio_input(struct gpio_chip *chip, unsigned offset)
>
> spin_lock_irqsave(&smgpio->lock, save);
>
> - ddr = readl(regs + SM501_GPIO_DDR_LOW);
> - writel(ddr & ~bit, regs + SM501_GPIO_DDR_LOW);
> + ddr = smc501_readl(regs + SM501_GPIO_DDR_LOW);
> + smc501_writel(ddr & ~bit, regs + SM501_GPIO_DDR_LOW);
>
> sm501_sync_regs(sm501_gpio_to_dev(smgpio));
> sm501_gpio_ensure_gpio(smchip, bit);
> @@ -994,18 +995,18 @@ static int sm501_gpio_output(struct gpio_chip *chip,
>
> spin_lock_irqsave(&smgpio->lock, save);
>
> - val = readl(regs + SM501_GPIO_DATA_LOW);
> + val = smc501_readl(regs + SM501_GPIO_DATA_LOW);
> if (value)
> val |= bit;
> else
> val &= ~bit;
> - writel(val, regs);
> + smc501_writel(val, regs);
>
> - ddr = readl(regs + SM501_GPIO_DDR_LOW);
> - writel(ddr | bit, regs + SM501_GPIO_DDR_LOW);
> + ddr = smc501_readl(regs + SM501_GPIO_DDR_LOW);
> + smc501_writel(ddr | bit, regs + SM501_GPIO_DDR_LOW);
>
> sm501_sync_regs(sm501_gpio_to_dev(smgpio));
> - writel(val, regs + SM501_GPIO_DATA_LOW);
> + smc501_writel(val, regs + SM501_GPIO_DATA_LOW);
>
> sm501_sync_regs(sm501_gpio_to_dev(smgpio));
> spin_unlock_irqrestore(&smgpio->lock, save);
> @@ -1231,7 +1232,7 @@ static ssize_t sm501_dbg_regs(struct device *dev,
>
> for (reg = 0x00; reg < 0x70; reg += 4) {
> ret = sprintf(ptr, "%08x = %08x\n",
> - reg, readl(sm->regs + reg));
> + reg, smc501_readl(sm->regs + reg));
> ptr += ret;
> }
>
> @@ -1255,10 +1256,10 @@ static inline void sm501_init_reg(struct sm501_devdata *sm,
> {
> unsigned long tmp;
>
> - tmp = readl(sm->regs + reg);
> + tmp = smc501_readl(sm->regs + reg);
> tmp &= ~r->mask;
> tmp |= r->set;
> - writel(tmp, sm->regs + reg);
> + smc501_writel(tmp, sm->regs + reg);
> }
>
> /* sm501_init_regs
> @@ -1299,7 +1300,7 @@ static void sm501_init_regs(struct sm501_devdata *sm,
>
> static int sm501_check_clocks(struct sm501_devdata *sm)
> {
> - unsigned long pwrmode = readl(sm->regs + SM501_CURRENT_CLOCK);
> + unsigned long pwrmode = smc501_readl(sm->regs + SM501_CURRENT_CLOCK);
> unsigned long msrc = (pwrmode & SM501_POWERMODE_M_SRC);
> unsigned long m1src = (pwrmode & SM501_POWERMODE_M1_SRC);
>
> @@ -1334,7 +1335,7 @@ static int __devinit sm501_init_dev(struct sm501_devdata *sm)
>
> INIT_LIST_HEAD(&sm->devices);
>
> - devid = readl(sm->regs + SM501_DEVICEID);
> + devid = smc501_readl(sm->regs + SM501_DEVICEID);
>
> if ((devid & SM501_DEVICEID_IDMASK) != SM501_DEVICEID_SM501) {
> dev_err(sm->dev, "incorrect device id %08lx\n", devid);
> @@ -1342,9 +1343,9 @@ static int __devinit sm501_init_dev(struct sm501_devdata *sm)
> }
>
> /* disable irqs */
> - writel(0, sm->regs + SM501_IRQ_MASK);
> + smc501_writel(0, sm->regs + SM501_IRQ_MASK);
>
> - dramctrl = readl(sm->regs + SM501_DRAM_CONTROL);
> + dramctrl = smc501_readl(sm->regs + SM501_DRAM_CONTROL);
> mem_avail = sm501_mem_local[(dramctrl >> 13) & 0x7];
>
> dev_info(sm->dev, "SM501 At %p: Version %08lx, %ld Mb, IRQ %d\n",
> @@ -1489,7 +1490,7 @@ static int sm501_plat_suspend(struct platform_device *pdev, pm_message_t state)
> struct sm501_devdata *sm = platform_get_drvdata(pdev);
>
> sm->in_suspend = 1;
> - sm->pm_misc = readl(sm->regs + SM501_MISC_CONTROL);
> + sm->pm_misc = smc501_readl(sm->regs + SM501_MISC_CONTROL);
>
> sm501_dump_regs(sm);
>
> @@ -1513,9 +1514,9 @@ static int sm501_plat_resume(struct platform_device *pdev)
>
> /* check to see if we are in the same state as when suspended */
>
> - if (readl(sm->regs + SM501_MISC_CONTROL) != sm->pm_misc) {
> + if (smc501_readl(sm->regs + SM501_MISC_CONTROL) != sm->pm_misc) {
> dev_info(sm->dev, "SM501_MISC_CONTROL changed over sleep\n");
> - writel(sm->pm_misc, sm->regs + SM501_MISC_CONTROL);
> + smc501_writel(sm->pm_misc, sm->regs + SM501_MISC_CONTROL);
>
> /* our suspend causes the controller state to change,
> * either by something attempting setup, power loss,
> diff --git a/drivers/video/sm501fb.c b/drivers/video/sm501fb.c
> index bcb44a5..5df406c 100644
> --- a/drivers/video/sm501fb.c
> +++ b/drivers/video/sm501fb.c
> @@ -117,7 +117,7 @@ static inline int v_total(struct fb_var_screeninfo *var)
>
> static inline void sm501fb_sync_regs(struct sm501fb_info *info)
> {
> - readl(info->regs);
> + smc501_readl(info->regs);
> }
>
> /* sm501_alloc_mem
> @@ -262,7 +262,7 @@ static void sm501fb_setup_gamma(struct sm501fb_info *fbi,
>
> /* set gamma values */
> for (offset = 0; offset < 256 * 4; offset += 4) {
> - writel(value, fbi->regs + palette + offset);
> + smc501_writel(value, fbi->regs + palette + offset);
> value += 0x010101; /* Advance RGB by 1,1,1.*/
> }
> }
> @@ -476,7 +476,8 @@ static int sm501fb_set_par_common(struct fb_info *info,
>
> /* set start of framebuffer to the screen */
>
> - writel(par->screen.sm_addr | SM501_ADDR_FLIP, fbi->regs + head_addr);
> + smc501_writel(par->screen.sm_addr | SM501_ADDR_FLIP,
> + fbi->regs + head_addr);
>
> /* program CRT clock */
>
> @@ -519,7 +520,7 @@ static void sm501fb_set_par_geometry(struct fb_info *info,
> reg = info->fix.line_length;
> reg |= ((var->xres * var->bits_per_pixel)/8) << 16;
>
> - writel(reg, fbi->regs + (par->head == HEAD_CRT ?
> + smc501_writel(reg, fbi->regs + (par->head == HEAD_CRT ?
> SM501_DC_CRT_FB_OFFSET : SM501_DC_PANEL_FB_OFFSET));
>
> /* program horizontal total */
> @@ -527,27 +528,27 @@ static void sm501fb_set_par_geometry(struct fb_info *info,
> reg = (h_total(var) - 1) << 16;
> reg |= (var->xres - 1);
>
> - writel(reg, base + SM501_OFF_DC_H_TOT);
> + smc501_writel(reg, base + SM501_OFF_DC_H_TOT);
>
> /* program horizontal sync */
>
> reg = var->hsync_len << 16;
> reg |= var->xres + var->right_margin - 1;
>
> - writel(reg, base + SM501_OFF_DC_H_SYNC);
> + smc501_writel(reg, base + SM501_OFF_DC_H_SYNC);
>
> /* program vertical total */
>
> reg = (v_total(var) - 1) << 16;
> reg |= (var->yres - 1);
>
> - writel(reg, base + SM501_OFF_DC_V_TOT);
> + smc501_writel(reg, base + SM501_OFF_DC_V_TOT);
>
> /* program vertical sync */
> reg = var->vsync_len << 16;
> reg |= var->yres + var->lower_margin - 1;
>
> - writel(reg, base + SM501_OFF_DC_V_SYNC);
> + smc501_writel(reg, base + SM501_OFF_DC_V_SYNC);
> }
>
> /* sm501fb_pan_crt
> @@ -566,15 +567,15 @@ static int sm501fb_pan_crt(struct fb_var_screeninfo *var,
>
> xoffs = var->xoffset * bytes_pixel;
>
> - reg = readl(fbi->regs + SM501_DC_CRT_CONTROL);
> + reg = smc501_readl(fbi->regs + SM501_DC_CRT_CONTROL);
>
> reg &= ~SM501_DC_CRT_CONTROL_PIXEL_MASK;
> reg |= ((xoffs & 15) / bytes_pixel) << 4;
> - writel(reg, fbi->regs + SM501_DC_CRT_CONTROL);
> + smc501_writel(reg, fbi->regs + SM501_DC_CRT_CONTROL);
>
> reg = (par->screen.sm_addr + xoffs +
> var->yoffset * info->fix.line_length);
> - writel(reg | SM501_ADDR_FLIP, fbi->regs + SM501_DC_CRT_FB_ADDR);
> + smc501_writel(reg | SM501_ADDR_FLIP, fbi->regs + SM501_DC_CRT_FB_ADDR);
>
> sm501fb_sync_regs(fbi);
> return 0;
> @@ -593,10 +594,10 @@ static int sm501fb_pan_pnl(struct fb_var_screeninfo *var,
> unsigned long reg;
>
> reg = var->xoffset | (var->xres_virtual << 16);
> - writel(reg, fbi->regs + SM501_DC_PANEL_FB_WIDTH);
> + smc501_writel(reg, fbi->regs + SM501_DC_PANEL_FB_WIDTH);
>
> reg = var->yoffset | (var->yres_virtual << 16);
> - writel(reg, fbi->regs + SM501_DC_PANEL_FB_HEIGHT);
> + smc501_writel(reg, fbi->regs + SM501_DC_PANEL_FB_HEIGHT);
>
> sm501fb_sync_regs(fbi);
> return 0;
> @@ -622,7 +623,7 @@ static int sm501fb_set_par_crt(struct fb_info *info)
> /* enable CRT DAC - note 0 is on!*/
> sm501_misc_control(fbi->dev->parent, 0, SM501_MISC_DAC_POWER);
>
> - control = readl(fbi->regs + SM501_DC_CRT_CONTROL);
> + control = smc501_readl(fbi->regs + SM501_DC_CRT_CONTROL);
>
> control &= (SM501_DC_CRT_CONTROL_PIXEL_MASK |
> SM501_DC_CRT_CONTROL_GAMMA |
> @@ -684,7 +685,7 @@ static int sm501fb_set_par_crt(struct fb_info *info)
> out_update:
> dev_dbg(fbi->dev, "new control is %08lx\n", control);
>
> - writel(control, fbi->regs + SM501_DC_CRT_CONTROL);
> + smc501_writel(control, fbi->regs + SM501_DC_CRT_CONTROL);
> sm501fb_sync_regs(fbi);
>
> return 0;
> @@ -696,18 +697,18 @@ static void sm501fb_panel_power(struct sm501fb_info *fbi, int to)
> void __iomem *ctrl_reg = fbi->regs + SM501_DC_PANEL_CONTROL;
> struct sm501_platdata_fbsub *pd = fbi->pdata->fb_pnl;
>
> - control = readl(ctrl_reg);
> + control = smc501_readl(ctrl_reg);
>
> if (to && (control & SM501_DC_PANEL_CONTROL_VDD) == 0) {
> /* enable panel power */
>
> control |= SM501_DC_PANEL_CONTROL_VDD; /* FPVDDEN */
> - writel(control, ctrl_reg);
> + smc501_writel(control, ctrl_reg);
> sm501fb_sync_regs(fbi);
> mdelay(10);
>
> control |= SM501_DC_PANEL_CONTROL_DATA; /* DATA */
> - writel(control, ctrl_reg);
> + smc501_writel(control, ctrl_reg);
> sm501fb_sync_regs(fbi);
> mdelay(10);
>
> @@ -719,7 +720,7 @@ static void sm501fb_panel_power(struct sm501fb_info *fbi, int to)
> else
> control |= SM501_DC_PANEL_CONTROL_BIAS;
>
> - writel(control, ctrl_reg);
> + smc501_writel(control, ctrl_reg);
> sm501fb_sync_regs(fbi);
> mdelay(10);
> }
> @@ -730,7 +731,7 @@ static void sm501fb_panel_power(struct sm501fb_info *fbi, int to)
> else
> control |= SM501_DC_PANEL_CONTROL_FPEN;
>
> - writel(control, ctrl_reg);
> + smc501_writel(control, ctrl_reg);
> sm501fb_sync_regs(fbi);
> mdelay(10);
> }
> @@ -742,7 +743,7 @@ static void sm501fb_panel_power(struct sm501fb_info *fbi, int to)
> else
> control &= ~SM501_DC_PANEL_CONTROL_FPEN;
>
> - writel(control, ctrl_reg);
> + smc501_writel(control, ctrl_reg);
> sm501fb_sync_regs(fbi);
> mdelay(10);
> }
> @@ -753,18 +754,18 @@ static void sm501fb_panel_power(struct sm501fb_info *fbi, int to)
> else
> control &= ~SM501_DC_PANEL_CONTROL_BIAS;
>
> - writel(control, ctrl_reg);
> + smc501_writel(control, ctrl_reg);
> sm501fb_sync_regs(fbi);
> mdelay(10);
> }
>
> control &= ~SM501_DC_PANEL_CONTROL_DATA;
> - writel(control, ctrl_reg);
> + smc501_writel(control, ctrl_reg);
> sm501fb_sync_regs(fbi);
> mdelay(10);
>
> control &= ~SM501_DC_PANEL_CONTROL_VDD;
> - writel(control, ctrl_reg);
> + smc501_writel(control, ctrl_reg);
> sm501fb_sync_regs(fbi);
> mdelay(10);
> }
> @@ -799,7 +800,7 @@ static int sm501fb_set_par_pnl(struct fb_info *info)
>
> /* update control register */
>
> - control = readl(fbi->regs + SM501_DC_PANEL_CONTROL);
> + control = smc501_readl(fbi->regs + SM501_DC_PANEL_CONTROL);
> control &= (SM501_DC_PANEL_CONTROL_GAMMA |
> SM501_DC_PANEL_CONTROL_VDD |
> SM501_DC_PANEL_CONTROL_DATA |
> @@ -833,16 +834,16 @@ static int sm501fb_set_par_pnl(struct fb_info *info)
> BUG();
> }
>
> - writel(0x0, fbi->regs + SM501_DC_PANEL_PANNING_CONTROL);
> + smc501_writel(0x0, fbi->regs + SM501_DC_PANEL_PANNING_CONTROL);
>
> /* panel plane top left and bottom right location */
>
> - writel(0x00, fbi->regs + SM501_DC_PANEL_TL_LOC);
> + smc501_writel(0x00, fbi->regs + SM501_DC_PANEL_TL_LOC);
>
> reg = var->xres - 1;
> reg |= (var->yres - 1) << 16;
>
> - writel(reg, fbi->regs + SM501_DC_PANEL_BR_LOC);
> + smc501_writel(reg, fbi->regs + SM501_DC_PANEL_BR_LOC);
>
> /* program panel control register */
>
> @@ -855,7 +856,7 @@ static int sm501fb_set_par_pnl(struct fb_info *info)
> if ((var->sync & FB_SYNC_VERT_HIGH_ACT) == 0)
> control |= SM501_DC_PANEL_CONTROL_VSP;
>
> - writel(control, fbi->regs + SM501_DC_PANEL_CONTROL);
> + smc501_writel(control, fbi->regs + SM501_DC_PANEL_CONTROL);
> sm501fb_sync_regs(fbi);
>
> /* ensure the panel interface is not tristated at this point */
> @@ -924,7 +925,7 @@ static int sm501fb_setcolreg(unsigned regno,
> val |= (green >> 8) << 8;
> val |= blue >> 8;
>
> - writel(val, base + (regno * 4));
> + smc501_writel(val, base + (regno * 4));
> }
>
> break;
> @@ -980,7 +981,7 @@ static int sm501fb_blank_crt(int blank_mode, struct fb_info *info)
>
> dev_dbg(fbi->dev, "%s(mode=%d, %p)\n", __func__, blank_mode, info);
>
> - ctrl = readl(fbi->regs + SM501_DC_CRT_CONTROL);
> + ctrl = smc501_readl(fbi->regs + SM501_DC_CRT_CONTROL);
>
> switch (blank_mode) {
> case FB_BLANK_POWERDOWN:
> @@ -1004,7 +1005,7 @@ static int sm501fb_blank_crt(int blank_mode, struct fb_info *info)
>
> }
>
> - writel(ctrl, fbi->regs + SM501_DC_CRT_CONTROL);
> + smc501_writel(ctrl, fbi->regs + SM501_DC_CRT_CONTROL);
> sm501fb_sync_regs(fbi);
>
> return 0;
> @@ -1041,12 +1042,14 @@ static int sm501fb_cursor(struct fb_info *info, struct fb_cursor *cursor)
> if (cursor->image.depth > 1)
> return -EINVAL;
>
> - hwc_addr = readl(base + SM501_OFF_HWC_ADDR);
> + hwc_addr = smc501_readl(base + SM501_OFF_HWC_ADDR);
>
> if (cursor->enable)
> - writel(hwc_addr | SM501_HWC_EN, base + SM501_OFF_HWC_ADDR);
> + smc501_writel(hwc_addr | SM501_HWC_EN,
> + base + SM501_OFF_HWC_ADDR);
> else
> - writel(hwc_addr & ~SM501_HWC_EN, base + SM501_OFF_HWC_ADDR);
> + smc501_writel(hwc_addr & ~SM501_HWC_EN,
> + base + SM501_OFF_HWC_ADDR);
>
> /* set data */
> if (cursor->set & FB_CUR_SETPOS) {
> @@ -1060,7 +1063,7 @@ static int sm501fb_cursor(struct fb_info *info, struct fb_cursor *cursor)
>
> //y += cursor->image.height;
>
> - writel(x | (y << 16), base + SM501_OFF_HWC_LOC);
> + smc501_writel(x | (y << 16), base + SM501_OFF_HWC_LOC);
> }
>
> if (cursor->set & FB_CUR_SETCMAP) {
> @@ -1080,8 +1083,8 @@ static int sm501fb_cursor(struct fb_info *info, struct fb_cursor *cursor)
>
> dev_dbg(fbi->dev, "fgcol %08lx, bgcol %08lx\n", fg, bg);
>
> - writel(bg, base + SM501_OFF_HWC_COLOR_1_2);
> - writel(fg, base + SM501_OFF_HWC_COLOR_3);
> + smc501_writel(bg, base + SM501_OFF_HWC_COLOR_1_2);
> + smc501_writel(fg, base + SM501_OFF_HWC_COLOR_3);
> }
>
> if (cursor->set & FB_CUR_SETSIZE ||
> @@ -1102,7 +1105,7 @@ static int sm501fb_cursor(struct fb_info *info, struct fb_cursor *cursor)
> __func__, cursor->image.width, cursor->image.height);
>
> for (op = 0; op < (64*64*2)/8; op+=4)
> - writel(0x0, dst + op);
> + smc501_writel(0x0, dst + op);
>
> for (y = 0; y < cursor->image.height; y++) {
> for (x = 0; x < cursor->image.width; x++) {
> @@ -1141,7 +1144,7 @@ static ssize_t sm501fb_crtsrc_show(struct device *dev,
> struct sm501fb_info *info = dev_get_drvdata(dev);
> unsigned long ctrl;
>
> - ctrl = readl(info->regs + SM501_DC_CRT_CONTROL);
> + ctrl = smc501_readl(info->regs + SM501_DC_CRT_CONTROL);
> ctrl &= SM501_DC_CRT_CONTROL_SEL;
>
> return snprintf(buf, PAGE_SIZE, "%s\n", ctrl ? "crt" : "panel");
> @@ -1172,7 +1175,7 @@ static ssize_t sm501fb_crtsrc_store(struct device *dev,
>
> dev_info(dev, "setting crt source to head %d\n", head);
>
> - ctrl = readl(info->regs + SM501_DC_CRT_CONTROL);
> + ctrl = smc501_readl(info->regs + SM501_DC_CRT_CONTROL);
>
> if (head == HEAD_CRT) {
> ctrl |= SM501_DC_CRT_CONTROL_SEL;
> @@ -1184,7 +1187,7 @@ static ssize_t sm501fb_crtsrc_store(struct device *dev,
> ctrl &= ~SM501_DC_CRT_CONTROL_TE;
> }
>
> - writel(ctrl, info->regs + SM501_DC_CRT_CONTROL);
> + smc501_writel(ctrl, info->regs + SM501_DC_CRT_CONTROL);
> sm501fb_sync_regs(info);
>
> return len;
> @@ -1205,7 +1208,8 @@ static int sm501fb_show_regs(struct sm501fb_info *info, char *ptr,
> unsigned int reg;
>
> for (reg = start; reg < (len + start); reg += 4)
> - ptr += sprintf(ptr, "%08x = %08x\n", reg, readl(mem + reg));
> + ptr += sprintf(ptr, "%08x = %08x\n", reg,
> + smc501_readl(mem + reg));
>
> return ptr - buf;
> }
> @@ -1257,7 +1261,7 @@ static int sm501fb_sync(struct fb_info *info)
>
> /* wait for the 2d engine to be ready */
> while ((count > 0) &&
> - (readl(fbi->regs + SM501_SYSTEM_CONTROL) &
> + (smc501_readl(fbi->regs + SM501_SYSTEM_CONTROL) &
> SM501_SYSCTRL_2D_ENGINE_STATUS) != 0)
> count--;
>
> @@ -1312,45 +1316,46 @@ static void sm501fb_copyarea(struct fb_info *info, const struct fb_copyarea *are
> return;
>
> /* set the base addresses */
> - writel(par->screen.sm_addr, fbi->regs2d + SM501_2D_SOURCE_BASE);
> - writel(par->screen.sm_addr, fbi->regs2d + SM501_2D_DESTINATION_BASE);
> + smc501_writel(par->screen.sm_addr, fbi->regs2d + SM501_2D_SOURCE_BASE);
> + smc501_writel(par->screen.sm_addr,
> + fbi->regs2d + SM501_2D_DESTINATION_BASE);
>
> /* set the window width */
> - writel((info->var.xres << 16) | info->var.xres,
> + smc501_writel((info->var.xres << 16) | info->var.xres,
> fbi->regs2d + SM501_2D_WINDOW_WIDTH);
>
> /* set window stride */
> - writel((info->var.xres_virtual << 16) | info->var.xres_virtual,
> + smc501_writel((info->var.xres_virtual << 16) | info->var.xres_virtual,
> fbi->regs2d + SM501_2D_PITCH);
>
> /* set data format */
> switch (info->var.bits_per_pixel) {
> case 8:
> - writel(0, fbi->regs2d + SM501_2D_STRETCH);
> + smc501_writel(0, fbi->regs2d + SM501_2D_STRETCH);
> break;
> case 16:
> - writel(0x00100000, fbi->regs2d + SM501_2D_STRETCH);
> + smc501_writel(0x00100000, fbi->regs2d + SM501_2D_STRETCH);
> break;
> case 32:
> - writel(0x00200000, fbi->regs2d + SM501_2D_STRETCH);
> + smc501_writel(0x00200000, fbi->regs2d + SM501_2D_STRETCH);
> break;
> }
>
> /* 2d compare mask */
> - writel(0xffffffff, fbi->regs2d + SM501_2D_COLOR_COMPARE_MASK);
> + smc501_writel(0xffffffff, fbi->regs2d + SM501_2D_COLOR_COMPARE_MASK);
>
> /* 2d mask */
> - writel(0xffffffff, fbi->regs2d + SM501_2D_MASK);
> + smc501_writel(0xffffffff, fbi->regs2d + SM501_2D_MASK);
>
> /* source and destination x y */
> - writel((sx << 16) | sy, fbi->regs2d + SM501_2D_SOURCE);
> - writel((dx << 16) | dy, fbi->regs2d + SM501_2D_DESTINATION);
> + smc501_writel((sx << 16) | sy, fbi->regs2d + SM501_2D_SOURCE);
> + smc501_writel((dx << 16) | dy, fbi->regs2d + SM501_2D_DESTINATION);
>
> /* w/h */
> - writel((width << 16) | height, fbi->regs2d + SM501_2D_DIMENSION);
> + smc501_writel((width << 16) | height, fbi->regs2d + SM501_2D_DIMENSION);
>
> /* do area move */
> - writel(0x800000cc | rtl, fbi->regs2d + SM501_2D_CONTROL);
> + smc501_writel(0x800000cc | rtl, fbi->regs2d + SM501_2D_CONTROL);
> }
>
> static void sm501fb_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
> @@ -1372,47 +1377,49 @@ static void sm501fb_fillrect(struct fb_info *info, const struct fb_fillrect *rec
> return;
>
> /* set the base addresses */
> - writel(par->screen.sm_addr, fbi->regs2d + SM501_2D_SOURCE_BASE);
> - writel(par->screen.sm_addr, fbi->regs2d + SM501_2D_DESTINATION_BASE);
> + smc501_writel(par->screen.sm_addr, fbi->regs2d + SM501_2D_SOURCE_BASE);
> + smc501_writel(par->screen.sm_addr,
> + fbi->regs2d + SM501_2D_DESTINATION_BASE);
>
> /* set the window width */
> - writel((info->var.xres << 16) | info->var.xres,
> + smc501_writel((info->var.xres << 16) | info->var.xres,
> fbi->regs2d + SM501_2D_WINDOW_WIDTH);
>
> /* set window stride */
> - writel((info->var.xres_virtual << 16) | info->var.xres_virtual,
> + smc501_writel((info->var.xres_virtual << 16) | info->var.xres_virtual,
> fbi->regs2d + SM501_2D_PITCH);
>
> /* set data format */
> switch (info->var.bits_per_pixel) {
> case 8:
> - writel(0, fbi->regs2d + SM501_2D_STRETCH);
> + smc501_writel(0, fbi->regs2d + SM501_2D_STRETCH);
> break;
> case 16:
> - writel(0x00100000, fbi->regs2d + SM501_2D_STRETCH);
> + smc501_writel(0x00100000, fbi->regs2d + SM501_2D_STRETCH);
> break;
> case 32:
> - writel(0x00200000, fbi->regs2d + SM501_2D_STRETCH);
> + smc501_writel(0x00200000, fbi->regs2d + SM501_2D_STRETCH);
> break;
> }
>
> /* 2d compare mask */
> - writel(0xffffffff, fbi->regs2d + SM501_2D_COLOR_COMPARE_MASK);
> + smc501_writel(0xffffffff, fbi->regs2d + SM501_2D_COLOR_COMPARE_MASK);
>
> /* 2d mask */
> - writel(0xffffffff, fbi->regs2d + SM501_2D_MASK);
> + smc501_writel(0xffffffff, fbi->regs2d + SM501_2D_MASK);
>
> /* colour */
> - writel(rect->color, fbi->regs2d + SM501_2D_FOREGROUND);
> + smc501_writel(rect->color, fbi->regs2d + SM501_2D_FOREGROUND);
>
> /* x y */
> - writel((rect->dx << 16) | rect->dy, fbi->regs2d + SM501_2D_DESTINATION);
> + smc501_writel((rect->dx << 16) | rect->dy,
> + fbi->regs2d + SM501_2D_DESTINATION);
>
> /* w/h */
> - writel((width << 16) | height, fbi->regs2d + SM501_2D_DIMENSION);
> + smc501_writel((width << 16) | height, fbi->regs2d + SM501_2D_DIMENSION);
>
> /* do rectangle fill */
> - writel(0x800100cc, fbi->regs2d + SM501_2D_CONTROL);
> + smc501_writel(0x800100cc, fbi->regs2d + SM501_2D_CONTROL);
> }
>
>
> @@ -1470,11 +1477,12 @@ static int sm501_init_cursor(struct fb_info *fbi, unsigned int reg_base)
>
> /* initialise the colour registers */
>
> - writel(par->cursor.sm_addr, par->cursor_regs + SM501_OFF_HWC_ADDR);
> + smc501_writel(par->cursor.sm_addr,
> + par->cursor_regs + SM501_OFF_HWC_ADDR);
>
> - writel(0x00, par->cursor_regs + SM501_OFF_HWC_LOC);
> - writel(0x00, par->cursor_regs + SM501_OFF_HWC_COLOR_1_2);
> - writel(0x00, par->cursor_regs + SM501_OFF_HWC_COLOR_3);
> + smc501_writel(0x00, par->cursor_regs + SM501_OFF_HWC_LOC);
> + smc501_writel(0x00, par->cursor_regs + SM501_OFF_HWC_COLOR_1_2);
> + smc501_writel(0x00, par->cursor_regs + SM501_OFF_HWC_COLOR_3);
> sm501fb_sync_regs(info);
>
> return 0;
> @@ -1581,7 +1589,7 @@ static int sm501fb_start(struct sm501fb_info *info,
>
> /* clear palette ram - undefined at power on */
> for (k = 0; k < (256 * 3); k++)
> - writel(0, info->regs + SM501_DC_PANEL_PALETTE + (k * 4));
> + smc501_writel(0, info->regs + SM501_DC_PANEL_PALETTE + (k * 4));
>
> /* enable display controller */
> sm501_unit_power(dev->parent, SM501_GATE_DISPLAY, 1);
> @@ -1649,20 +1657,20 @@ static int sm501fb_init_fb(struct fb_info *fb,
> switch (head) {
> case HEAD_CRT:
> pd = info->pdata->fb_crt;
> - ctrl = readl(info->regs + SM501_DC_CRT_CONTROL);
> + ctrl = smc501_readl(info->regs + SM501_DC_CRT_CONTROL);
> enable = (ctrl & SM501_DC_CRT_CONTROL_ENABLE) ? 1 : 0;
>
> /* ensure we set the correct source register */
> if (info->pdata->fb_route != SM501_FB_CRT_PANEL) {
> ctrl |= SM501_DC_CRT_CONTROL_SEL;
> - writel(ctrl, info->regs + SM501_DC_CRT_CONTROL);
> + smc501_writel(ctrl, info->regs + SM501_DC_CRT_CONTROL);
> }
>
> break;
>
> case HEAD_PANEL:
> pd = info->pdata->fb_pnl;
> - ctrl = readl(info->regs + SM501_DC_PANEL_CONTROL);
> + ctrl = smc501_readl(info->regs + SM501_DC_PANEL_CONTROL);
> enable = (ctrl & SM501_DC_PANEL_CONTROL_EN) ? 1 : 0;
> break;
>
> @@ -1680,7 +1688,7 @@ static int sm501fb_init_fb(struct fb_info *fb,
>
> if (head == HEAD_CRT && info->pdata->fb_route == SM501_FB_CRT_PANEL) {
> ctrl &= ~SM501_DC_CRT_CONTROL_SEL;
> - writel(ctrl, info->regs + SM501_DC_CRT_CONTROL);
> + smc501_writel(ctrl, info->regs + SM501_DC_CRT_CONTROL);
> enable = 0;
> }
>
> @@ -2085,7 +2093,7 @@ static int sm501fb_suspend(struct platform_device *pdev, pm_message_t state)
> struct sm501fb_info *info = platform_get_drvdata(pdev);
>
> /* store crt control to resume with */
> - info->pm_crt_ctrl = readl(info->regs + SM501_DC_CRT_CONTROL);
> + info->pm_crt_ctrl = smc501_readl(info->regs + SM501_DC_CRT_CONTROL);
>
> sm501fb_suspend_fb(info, HEAD_CRT);
> sm501fb_suspend_fb(info, HEAD_PANEL);
> @@ -2109,10 +2117,10 @@ static int sm501fb_resume(struct platform_device *pdev)
>
> /* restore the items we want to be saved for crt control */
>
> - crt_ctrl = readl(info->regs + SM501_DC_CRT_CONTROL);
> + crt_ctrl = smc501_readl(info->regs + SM501_DC_CRT_CONTROL);
> crt_ctrl &= ~SM501_CRT_CTRL_SAVE;
> crt_ctrl |= info->pm_crt_ctrl & SM501_CRT_CTRL_SAVE;
> - writel(crt_ctrl, info->regs + SM501_DC_CRT_CONTROL);
> + smc501_writel(crt_ctrl, info->regs + SM501_DC_CRT_CONTROL);
>
> sm501fb_resume_fb(info, HEAD_CRT);
> sm501fb_resume_fb(info, HEAD_PANEL);
> diff --git a/include/linux/sm501.h b/include/linux/sm501.h
> index 214f932..02fde50 100644
> --- a/include/linux/sm501.h
> +++ b/include/linux/sm501.h
> @@ -172,3 +172,11 @@ struct sm501_platdata {
> struct sm501_platdata_gpio_i2c *gpio_i2c;
> unsigned int gpio_i2c_nr;
> };
> +
> +#if defined(CONFIG_PPC32)
> +#define smc501_readl(addr) ioread32be((addr))
> +#define smc501_writel(val, addr) iowrite32be((val), (addr))
> +#else
> +#define smc501_readl(addr) readl(addr)
> +#define smc501_writel(val, addr) writel(val, addr)
> +#endif
> --
> 1.7.4
>

2011-05-02 22:27:22

by Grant Likely

[permalink] [raw]
Subject: Re: [PATCH v6 3/6] video, sm501: add edid and commandline support

On Tue, Mar 22, 2011 at 09:27:29AM +0100, Heiko Schocher wrote:
> - add commandline options:
> sm501fb.mode:
> Specify resolution as "<xres>x<yres>[-<bpp>][@<refresh>]"
> sm501fb.bpp:
> Specify bit-per-pixel if not specified mode
>
> - Add support for encoding display mode information
> in the device tree using verbatim EDID block.
>
> If the "edid" entry in the "smi,sm501" node is present,
> the driver will build mode database using EDID data
> and allow setting the display modes from this database.
>
> Signed-off-by: Heiko Schocher <[email protected]>

Merged, thanks.

g.

> cc: Wolfram Sang <[email protected]>
> cc: Grant Likely <[email protected]>
> cc: Benjamin Herrenschmidt <[email protected]>
> cc: [email protected]
> cc: [email protected]
> cc: Ben Dooks <[email protected]>
> cc: Vincent Sanders <[email protected]>
> cc: Samuel Ortiz <[email protected]>
> cc: [email protected]
> cc: Randy Dunlap <[email protected]>
> cc: Wolfgang Denk <[email protected]>
> cc: Paul Mundt <[email protected]>
> ---
> - changes since v1:
> add Ben Dooks, Vincent Sanders and Samuel Ortiz to cc, as suggested from
> Paul Mundt.
> - changes since v2:
> add comments from Randy Dunlap:
> - move parameter documentation to Documentation/fb/sm501.txt
> - changes since v3:
> - rebased against v2.6.38-rc2
> - split in 3 patches
> - of support patch
> - i/o routine patch
> - edid support patch
> - changes since v4:
> - add "info->pdata = &sm501fb_def_pdata;" in sm501fb_probe()
> as Paul Mundt suggested (and I wrongly deleted)
> - move kfree(info->edid_data); to patch 3/4
> as edid_data is only allocated in the CONFIG_OF case
> - changes for v6:
> - repost complete patchserie
> - rebased against current head
>
> Documentation/fb/sm501.txt | 10 +++++++
> drivers/video/sm501fb.c | 65 ++++++++++++++++++++++++++++++++++++++++---
> 2 files changed, 70 insertions(+), 5 deletions(-)
> create mode 100644 Documentation/fb/sm501.txt
>
> diff --git a/Documentation/fb/sm501.txt b/Documentation/fb/sm501.txt
> new file mode 100644
> index 0000000..8d17aeb
> --- /dev/null
> +++ b/Documentation/fb/sm501.txt
> @@ -0,0 +1,10 @@
> +Configuration:
> +
> +You can pass the following kernel command line options to sm501 videoframebuffer:
> +
> + sm501fb.bpp= SM501 Display driver:
> + Specifiy bits-per-pixel if not specified by 'mode'
> +
> + sm501fb.mode= SM501 Display driver:
> + Specify resolution as
> + "<xres>x<yres>[-<bpp>][@<refresh>]"
> diff --git a/drivers/video/sm501fb.c b/drivers/video/sm501fb.c
> index 5df406c..f31252c 100644
> --- a/drivers/video/sm501fb.c
> +++ b/drivers/video/sm501fb.c
> @@ -41,6 +41,26 @@
> #include <linux/sm501.h>
> #include <linux/sm501-regs.h>
>
> +#include "edid.h"
> +
> +static char *fb_mode = "640x480-16@60";
> +static unsigned long default_bpp = 16;
> +
> +static struct fb_videomode __devinitdata sm501_default_mode = {
> + .refresh = 60,
> + .xres = 640,
> + .yres = 480,
> + .pixclock = 20833,
> + .left_margin = 142,
> + .right_margin = 13,
> + .upper_margin = 21,
> + .lower_margin = 1,
> + .hsync_len = 69,
> + .vsync_len = 3,
> + .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
> + .vmode = FB_VMODE_NONINTERLACED
> +};
> +
> #define NR_PALETTE 256
>
> enum sm501_controller {
> @@ -77,6 +97,7 @@ struct sm501fb_info {
> void __iomem *regs2d; /* 2d remapped registers */
> void __iomem *fbmem; /* remapped framebuffer */
> size_t fbmem_len; /* length of remapped region */
> + u8 *edid_data;
> };
>
> /* per-framebuffer private data */
> @@ -1725,9 +1746,16 @@ static int sm501fb_init_fb(struct fb_info *fb,
> fb->var.vmode = FB_VMODE_NONINTERLACED;
> fb->var.bits_per_pixel = 16;
>
> + if (info->edid_data) {
> + /* Now build modedb from EDID */
> + fb_edid_to_monspecs(info->edid_data, &fb->monspecs);
> + fb_videomode_to_modelist(fb->monspecs.modedb,
> + fb->monspecs.modedb_len,
> + &fb->modelist);
> + }
> +
> if (enable && (pd->flags & SM501FB_FLAG_USE_INIT_MODE) && 0) {
> /* TODO read the mode from the current display */
> -
> } else {
> if (pd->def_mode) {
> dev_info(info->dev, "using supplied mode\n");
> @@ -1737,12 +1765,34 @@ static int sm501fb_init_fb(struct fb_info *fb,
> fb->var.xres_virtual = fb->var.xres;
> fb->var.yres_virtual = fb->var.yres;
> } else {
> - ret = fb_find_mode(&fb->var, fb,
> + if (info->edid_data)
> + ret = fb_find_mode(&fb->var, fb, fb_mode,
> + fb->monspecs.modedb,
> + fb->monspecs.modedb_len,
> + &sm501_default_mode, default_bpp);
> + else
> + ret = fb_find_mode(&fb->var, fb,
> NULL, NULL, 0, NULL, 8);
>
> - if (ret == 0 || ret == 4) {
> - dev_err(info->dev,
> - "failed to get initial mode\n");
> + switch (ret) {
> + case 1:
> + dev_info(info->dev, "using mode specified in "
> + "@mode\n");
> + break;
> + case 2:
> + dev_info(info->dev, "using mode specified in "
> + "@mode with ignored refresh rate\n");
> + break;
> + case 3:
> + dev_info(info->dev, "using mode default "
> + "mode\n");
> + break;
> + case 4:
> + dev_info(info->dev, "using mode from list\n");
> + break;
> + default:
> + dev_info(info->dev, "ret = %d\n", ret);
> + dev_info(info->dev, "failed to find mode\n");
> return -EINVAL;
> }
> }
> @@ -2157,6 +2207,11 @@ static void __exit sm501fb_cleanup(void)
> module_init(sm501fb_init);
> module_exit(sm501fb_cleanup);
>
> +module_param_named(mode, fb_mode, charp, 0);
> +MODULE_PARM_DESC(mode,
> + "Specify resolution as \"<xres>x<yres>[-<bpp>][@<refresh>]\" ");
> +module_param_named(bpp, default_bpp, ulong, 0);
> +MODULE_PARM_DESC(bpp, "Specify bit-per-pixel if not specified mode");
> MODULE_AUTHOR("Ben Dooks, Vincent Sanders");
> MODULE_DESCRIPTION("SM501 Framebuffer driver");
> MODULE_LICENSE("GPL v2");
> --
> 1.7.4
>

2011-05-02 22:28:21

by Grant Likely

[permalink] [raw]
Subject: Re: [PATCH v6 4/6] video, sm501: add OF binding to support SM501

On Tue, Mar 22, 2011 at 09:27:30AM +0100, Heiko Schocher wrote:
> - add binding to OF, compatible name "smi,sm501"
>
> Signed-off-by: Heiko Schocher <[email protected]>
> Acked-by: Samuel Ortiz <[email protected]>

Merged, thanks.

g.

> cc: Wolfram Sang <[email protected]>
> cc: Grant Likely <[email protected]>
> cc: Benjamin Herrenschmidt <[email protected]>
> cc: [email protected]
> cc: [email protected]
> cc: Ben Dooks <[email protected]>
> cc: Vincent Sanders <[email protected]>
> cc: Samuel Ortiz <[email protected]>
> cc: [email protected]
> cc: Randy Dunlap <[email protected]>
> cc: Wolfgang Denk <[email protected]>
> cc: Paul Mundt <[email protected]>
> ---
> - changes since v1:
> add Ben Dooks, Vincent Sanders and Samuel Ortiz to cc, as suggested from
> Paul Mundt.
> - changes since v2:
> add comments from Randy Dunlap:
> - move parameter documentation to Documentation/fb/sm501.txt
> - changes since v3:
> - rebased against v2.6.38-rc2
> - split in 3 patches
> - of support patch
> - get rid of "#if defined(CONFIG_PPC_MPC52xx)" usage
> hide this in DTS, as Paul suggested.
> - i/o routine patch
> - edid support patch
> - changes since v4
> replace remaining CONFIG_PPC_MPC52xx with CONFIG_OF, as
> it is no longer MPC52xx only.
> - changes since v5
> free edid_data after its usage, as it is no longer needed,
> suggested from Paul Mundt. Also fall back to default if
> kmemdup(edid_data) fails.
> - changes for v6:
> - repost complete patchserie
> - rebased against current head
>
> Documentation/powerpc/dts-bindings/sm501.txt | 34 +++++++++++++++++++++++++
> drivers/mfd/sm501.c | 8 +++++-
> drivers/video/sm501fb.c | 35 +++++++++++++++++++++++++-
> 3 files changed, 75 insertions(+), 2 deletions(-)
> create mode 100644 Documentation/powerpc/dts-bindings/sm501.txt
>
> diff --git a/Documentation/powerpc/dts-bindings/sm501.txt b/Documentation/powerpc/dts-bindings/sm501.txt
> new file mode 100644
> index 0000000..7d319fb
> --- /dev/null
> +++ b/Documentation/powerpc/dts-bindings/sm501.txt
> @@ -0,0 +1,34 @@
> +* SM SM501
> +
> +The SM SM501 is a LCD controller, with proper hardware, it can also
> +drive DVI monitors.
> +
> +Required properties:
> +- compatible : should be "smi,sm501".
> +- reg : contain two entries:
> + - First entry: System Configuration register
> + - Second entry: IO space (Display Controller register)
> +- interrupts : SMI interrupt to the cpu should be described here.
> +- interrupt-parent : the phandle for the interrupt controller that
> + services interrupts for this device.
> +
> +Optional properties:
> +- mode : select a video mode:
> + <xres>x<yres>[-<bpp>][@<refresh>]
> +- edid : verbatim EDID data block describing attached display.
> + Data from the detailed timing descriptor will be used to
> + program the display controller.
> +- little-endian: availiable on big endian systems, to
> + set different foreign endian.
> +- big-endian: availiable on little endian systems, to
> + set different foreign endian.
> +
> +Example for MPC5200:
> + display@1,0 {
> + compatible = "smi,sm501";
> + reg = <1 0x00000000 0x00800000
> + 1 0x03e00000 0x00200000>;
> + interrupts = <1 1 3>;
> + mode = "640x480-32@60";
> + edid = [edid-data];
> + };
> diff --git a/drivers/mfd/sm501.c b/drivers/mfd/sm501.c
> index 558d5f3..574f696 100644
> --- a/drivers/mfd/sm501.c
> +++ b/drivers/mfd/sm501.c
> @@ -1377,7 +1377,7 @@ static int __devinit sm501_init_dev(struct sm501_devdata *sm)
> sm501_register_gpio(sm);
> }
>
> - if (pdata->gpio_i2c != NULL && pdata->gpio_i2c_nr > 0) {
> + if (pdata && 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
> @@ -1735,10 +1735,16 @@ static struct pci_driver sm501_pci_driver = {
>
> MODULE_ALIAS("platform:sm501");
>
> +static struct of_device_id __devinitdata of_sm501_match_tbl[] = {
> + { .compatible = "smi,sm501", },
> + { /* end */ }
> +};
> +
> static struct platform_driver sm501_plat_driver = {
> .driver = {
> .name = "sm501",
> .owner = THIS_MODULE,
> + .of_match_table = of_sm501_match_tbl,
> },
> .probe = sm501_plat_probe,
> .remove = sm501_plat_remove,
> diff --git a/drivers/video/sm501fb.c b/drivers/video/sm501fb.c
> index f31252c..f275385 100644
> --- a/drivers/video/sm501fb.c
> +++ b/drivers/video/sm501fb.c
> @@ -1729,6 +1729,15 @@ static int sm501fb_init_fb(struct fb_info *fb,
> FBINFO_HWACCEL_COPYAREA | FBINFO_HWACCEL_FILLRECT |
> FBINFO_HWACCEL_XPAN | FBINFO_HWACCEL_YPAN;
>
> +#if defined(CONFIG_OF)
> +#ifdef __BIG_ENDIAN
> + if (of_get_property(info->dev->parent->of_node, "little-endian", NULL))
> + fb->flags |= FBINFO_FOREIGN_ENDIAN;
> +#else
> + if (of_get_property(info->dev->parent->of_node, "big-endian", NULL))
> + fb->flags |= FBINFO_FOREIGN_ENDIAN;
> +#endif
> +#endif
> /* fixed data */
>
> fb->fix.type = FB_TYPE_PACKED_PIXELS;
> @@ -1933,8 +1942,32 @@ static int __devinit sm501fb_probe(struct platform_device *pdev)
> }
>
> if (info->pdata == NULL) {
> - dev_info(dev, "using default configuration data\n");
> + int found = 0;
> +#if defined(CONFIG_OF)
> + struct device_node *np = pdev->dev.parent->of_node;
> + const u8 *prop;
> + const char *cp;
> + int len;
> +
> info->pdata = &sm501fb_def_pdata;
> + if (np) {
> + /* Get EDID */
> + cp = of_get_property(np, "mode", &len);
> + if (cp)
> + strcpy(fb_mode, cp);
> + prop = of_get_property(np, "edid", &len);
> + if (prop && len == EDID_LENGTH) {
> + info->edid_data = kmemdup(prop, EDID_LENGTH,
> + GFP_KERNEL);
> + if (info->edid_data)
> + found = 1;
> + }
> + }
> +#endif
> + if (!found) {
> + dev_info(dev, "using default configuration data\n");
> + info->pdata = &sm501fb_def_pdata;
> + }
> }
>
> /* probe for the presence of each panel */
> --
> 1.7.4
>

2011-05-02 22:31:26

by Grant Likely

[permalink] [raw]
Subject: Re: [PATCH v6 6/6] powerpc, tqm5200: update tqm5200_defconfig to fit for charon board.

On Tue, Mar 22, 2011 at 10:10:27AM +0100, Wolfram Sang wrote:
> > As this board is tqm5200 based, added necessary changes
> > to the tqm5200_defconfig. In previous patchserie I added
> > the changes to mpc5200_defconfig, as Wolfram Sang mentioned,
> > but as tqm5200_defconfig is in mainline, and the board is
> > tqm5200 based, I think, thats the appropriate place, as
>
> I'd think the perfect solution would have been to merge the
> tqm-defconfig into the mpc5200-defconfig entirely and get rid of it.
> That being said, I don't think this issue is big enough to block this
> series, so fine enough with me.

Merged, thanks.

g.


2011-05-02 22:37:33

by Grant Likely

[permalink] [raw]
Subject: Re: [PATCH v6 3/6] video, sm501: add edid and commandline support

On Mon, May 2, 2011 at 4:27 PM, Grant Likely <[email protected]> wrote:
> On Tue, Mar 22, 2011 at 09:27:29AM +0100, Heiko Schocher wrote:
>> - add commandline options:
>> ? sm501fb.mode:
>> ? ? Specify resolution as "<xres>x<yres>[-<bpp>][@<refresh>]"
>> ? sm501fb.bpp:
>> ? ? Specify bit-per-pixel if not specified mode
>>
>> - Add support for encoding display mode information
>> ? in the device tree using verbatim EDID block.
>>
>> ? If the "edid" entry in the "smi,sm501" node is present,
>> ? the driver will build mode database using EDID data
>> ? and allow setting the display modes from this database.
>>
>> Signed-off-by: Heiko Schocher <[email protected]>
>
> Merged, thanks.

This patch causes the following build warning:

MODPOST vmlinux.o
WARNING: vmlinux.o(.text+0x1d5572): Section mismatch in reference from
the function sm501fb_init_fb() to the variable
.devinit.data:sm501_default_mode
The function sm501fb_init_fb() references
the variable __devinitdata sm501_default_mode.
This is often because sm501fb_init_fb lacks a __devinitdata
annotation or the annotation of sm501_default_mode is wrong.

WARNING: vmlinux.o(.text+0x1d557a): Section mismatch in reference from
the function sm501fb_init_fb() to the variable
.devinit.data:sm501_default_mode
The function sm501fb_init_fb() references
the variable __devinitdata sm501_default_mode.
This is often because sm501fb_init_fb lacks a __devinitdata
annotation or the annotation of sm501_default_mode is wrong.

I've dropped the __devinitdata declaration in what I committed; can
you investigate and post a fixup patch?

>
> g.
>
>> cc: Wolfram Sang <[email protected]>
>> cc: Grant Likely <[email protected]>
>> cc: Benjamin Herrenschmidt <[email protected]>
>> cc: [email protected]
>> cc: [email protected]
>> cc: Ben Dooks <[email protected]>
>> cc: Vincent Sanders <[email protected]>
>> cc: Samuel Ortiz <[email protected]>
>> cc: [email protected]
>> cc: Randy Dunlap <[email protected]>
>> cc: Wolfgang Denk <[email protected]>
>> cc: Paul Mundt <[email protected]>
>> ---
>> - changes since v1:
>> ? add Ben Dooks, Vincent Sanders and Samuel Ortiz to cc, as suggested from
>> ? Paul Mundt.
>> - changes since v2:
>> ? add comments from Randy Dunlap:
>> ? - move parameter documentation to Documentation/fb/sm501.txt
>> - changes since v3:
>> ? - rebased against v2.6.38-rc2
>> ? - split in 3 patches
>> ? ? - of support patch
>> ? ? - i/o routine patch
>> ? ? - edid support patch
>> - changes since v4:
>> ? - add "info->pdata = &sm501fb_def_pdata;" in sm501fb_probe()
>> ? ? as Paul Mundt suggested (and I wrongly deleted)
>> ? - move kfree(info->edid_data); to patch 3/4
>> ? ? as edid_data is only allocated in the CONFIG_OF case
>> - changes for v6:
>> ? - repost complete patchserie
>> ? - rebased against current head
>>
>> ?Documentation/fb/sm501.txt | ? 10 +++++++
>> ?drivers/video/sm501fb.c ? ?| ? 65 ++++++++++++++++++++++++++++++++++++++++---
>> ?2 files changed, 70 insertions(+), 5 deletions(-)
>> ?create mode 100644 Documentation/fb/sm501.txt
>>
>> diff --git a/Documentation/fb/sm501.txt b/Documentation/fb/sm501.txt
>> new file mode 100644
>> index 0000000..8d17aeb
>> --- /dev/null
>> +++ b/Documentation/fb/sm501.txt
>> @@ -0,0 +1,10 @@
>> +Configuration:
>> +
>> +You can pass the following kernel command line options to sm501 videoframebuffer:
>> +
>> + ? ? sm501fb.bpp= ? ?SM501 Display driver:
>> + ? ? ? ? ? ? ? ? ? ? Specifiy bits-per-pixel if not specified by 'mode'
>> +
>> + ? ? sm501fb.mode= ? SM501 Display driver:
>> + ? ? ? ? ? ? ? ? ? ? Specify resolution as
>> + ? ? ? ? ? ? ? ? ? ? "<xres>x<yres>[-<bpp>][@<refresh>]"
>> diff --git a/drivers/video/sm501fb.c b/drivers/video/sm501fb.c
>> index 5df406c..f31252c 100644
>> --- a/drivers/video/sm501fb.c
>> +++ b/drivers/video/sm501fb.c
>> @@ -41,6 +41,26 @@
>> ?#include <linux/sm501.h>
>> ?#include <linux/sm501-regs.h>
>>
>> +#include "edid.h"
>> +
>> +static char *fb_mode = "640x480-16@60";
>> +static unsigned long default_bpp = 16;
>> +
>> +static struct fb_videomode __devinitdata sm501_default_mode = {
>> + ? ? .refresh ? ? ? ?= 60,
>> + ? ? .xres ? ? ? ? ? = 640,
>> + ? ? .yres ? ? ? ? ? = 480,
>> + ? ? .pixclock ? ? ? = 20833,
>> + ? ? .left_margin ? ?= 142,
>> + ? ? .right_margin ? = 13,
>> + ? ? .upper_margin ? = 21,
>> + ? ? .lower_margin ? = 1,
>> + ? ? .hsync_len ? ? ?= 69,
>> + ? ? .vsync_len ? ? ?= 3,
>> + ? ? .sync ? ? ? ? ? = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
>> + ? ? .vmode ? ? ? ? ?= FB_VMODE_NONINTERLACED
>> +};
>> +
>> ?#define NR_PALETTE ? 256
>>
>> ?enum sm501_controller {
>> @@ -77,6 +97,7 @@ struct sm501fb_info {
>> ? ? ? void __iomem ? ? ? ? ? ?*regs2d; ? ? ? ?/* 2d remapped registers */
>> ? ? ? void __iomem ? ? ? ? ? ?*fbmem; ? ? ? ? /* remapped framebuffer */
>> ? ? ? size_t ? ? ? ? ? ? ? ? ? fbmem_len; ? ? /* length of remapped region */
>> + ? ? u8 *edid_data;
>> ?};
>>
>> ?/* per-framebuffer private data */
>> @@ -1725,9 +1746,16 @@ static int sm501fb_init_fb(struct fb_info *fb,
>> ? ? ? fb->var.vmode ? ? ? ? ? = FB_VMODE_NONINTERLACED;
>> ? ? ? fb->var.bits_per_pixel ?= 16;
>>
>> + ? ? if (info->edid_data) {
>> + ? ? ? ? ? ? ? ? ? ? /* Now build modedb from EDID */
>> + ? ? ? ? ? ? ? ? ? ? fb_edid_to_monspecs(info->edid_data, &fb->monspecs);
>> + ? ? ? ? ? ? ? ? ? ? fb_videomode_to_modelist(fb->monspecs.modedb,
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?fb->monspecs.modedb_len,
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?&fb->modelist);
>> + ? ? }
>> +
>> ? ? ? if (enable && (pd->flags & SM501FB_FLAG_USE_INIT_MODE) && 0) {
>> ? ? ? ? ? ? ? /* TODO read the mode from the current display */
>> -
>> ? ? ? } else {
>> ? ? ? ? ? ? ? if (pd->def_mode) {
>> ? ? ? ? ? ? ? ? ? ? ? dev_info(info->dev, "using supplied mode\n");
>> @@ -1737,12 +1765,34 @@ static int sm501fb_init_fb(struct fb_info *fb,
>> ? ? ? ? ? ? ? ? ? ? ? fb->var.xres_virtual = fb->var.xres;
>> ? ? ? ? ? ? ? ? ? ? ? fb->var.yres_virtual = fb->var.yres;
>> ? ? ? ? ? ? ? } else {
>> - ? ? ? ? ? ? ? ? ? ? ret = fb_find_mode(&fb->var, fb,
>> + ? ? ? ? ? ? ? ? ? ? if (info->edid_data)
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ret = fb_find_mode(&fb->var, fb, fb_mode,
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? fb->monspecs.modedb,
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? fb->monspecs.modedb_len,
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &sm501_default_mode, default_bpp);
>> + ? ? ? ? ? ? ? ? ? ? else
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ret = fb_find_mode(&fb->var, fb,
>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NULL, NULL, 0, NULL, 8);
>>
>> - ? ? ? ? ? ? ? ? ? ? if (ret == 0 || ret == 4) {
>> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? dev_err(info->dev,
>> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "failed to get initial mode\n");
>> + ? ? ? ? ? ? ? ? ? ? switch (ret) {
>> + ? ? ? ? ? ? ? ? ? ? case 1:
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? dev_info(info->dev, "using mode specified in "
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "@mode\n");
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
>> + ? ? ? ? ? ? ? ? ? ? case 2:
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? dev_info(info->dev, "using mode specified in "
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "@mode with ignored refresh rate\n");
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
>> + ? ? ? ? ? ? ? ? ? ? case 3:
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? dev_info(info->dev, "using mode default "
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "mode\n");
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
>> + ? ? ? ? ? ? ? ? ? ? case 4:
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? dev_info(info->dev, "using mode from list\n");
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
>> + ? ? ? ? ? ? ? ? ? ? default:
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? dev_info(info->dev, "ret = %d\n", ret);
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? dev_info(info->dev, "failed to find mode\n");
>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
>> ? ? ? ? ? ? ? ? ? ? ? }
>> ? ? ? ? ? ? ? }
>> @@ -2157,6 +2207,11 @@ static void __exit sm501fb_cleanup(void)
>> ?module_init(sm501fb_init);
>> ?module_exit(sm501fb_cleanup);
>>
>> +module_param_named(mode, fb_mode, charp, 0);
>> +MODULE_PARM_DESC(mode,
>> + ? ? "Specify resolution as \"<xres>x<yres>[-<bpp>][@<refresh>]\" ");
>> +module_param_named(bpp, default_bpp, ulong, 0);
>> +MODULE_PARM_DESC(bpp, "Specify bit-per-pixel if not specified mode");
>> ?MODULE_AUTHOR("Ben Dooks, Vincent Sanders");
>> ?MODULE_DESCRIPTION("SM501 Framebuffer driver");
>> ?MODULE_LICENSE("GPL v2");
>> --
>> 1.7.4
>>
>



--
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.

2011-05-03 05:27:29

by Heiko Schocher

[permalink] [raw]
Subject: Re: [PATCH v6 0/6] powerpc, 52xx: add charon board support

Hello Grant,

Grant Likely wrote:
> On Tue, Mar 22, 2011 at 09:27:26AM +0100, Heiko Schocher wrote:
>> cc: Wolfram Sang <[email protected]>
>> cc: Grant Likely <[email protected]>
>> cc: Benjamin Herrenschmidt <[email protected]>
>> cc: [email protected]
>> cc: [email protected]
>> cc: Ben Dooks <[email protected]>
>> cc: Vincent Sanders <[email protected]>
>> cc: Samuel Ortiz <[email protected]>
>> cc: [email protected]
>> cc: Randy Dunlap <[email protected]>
>> cc: Wolfgang Denk <[email protected]>
>> cc: Paul Mundt <[email protected]>
>>
>> changes since v5:
>> - repost complete patchseries, as Paul Mundt suggested
>> - rebased against current head
>> - add Acked-by from Samuel Ortiz (MFD parts)
>> http://www.spinics.net/lists/linux-fbdev/msg02550.html
>> http://linux.derkeiler.com/Mailing-Lists/Kernel/2011-01/msg11798.html
>>
>> and Benjamin Herrenschmidt (DTS parts)
>> http://lists.ozlabs.org/pipermail/linuxppc-dev/2011-February/088279.html
>> - removed patch
>> "powerpc, mpc5200: update mpc5200_defconfig to fit for charon board."
>> therefore added
>> "powerpc, tqm5200: update tqm5200_defconfig to fit for charon board."
>
> Refresh my memory, why was the mpc5200_defconfig updated dropped?

Because it is a board based on the tqm5200 board port ... no other
reason.

bye,
Heiko
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany

2011-05-03 05:27:16

by Heiko Schocher

[permalink] [raw]
Subject: Re: [PATCH v6 3/6] video, sm501: add edid and commandline support

Hello Grant,

Grant Likely wrote:
> On Mon, May 2, 2011 at 4:27 PM, Grant Likely <[email protected]> wrote:
>> On Tue, Mar 22, 2011 at 09:27:29AM +0100, Heiko Schocher wrote:
>>> - add commandline options:
>>> sm501fb.mode:
>>> Specify resolution as "<xres>x<yres>[-<bpp>][@<refresh>]"
>>> sm501fb.bpp:
>>> Specify bit-per-pixel if not specified mode
>>>
>>> - Add support for encoding display mode information
>>> in the device tree using verbatim EDID block.
>>>
>>> If the "edid" entry in the "smi,sm501" node is present,
>>> the driver will build mode database using EDID data
>>> and allow setting the display modes from this database.
>>>
>>> Signed-off-by: Heiko Schocher <[email protected]>
>> Merged, thanks.
>
> This patch causes the following build warning:

Hups ... when I posted the patch, it compiled clean ...

> MODPOST vmlinux.o
> WARNING: vmlinux.o(.text+0x1d5572): Section mismatch in reference from
> the function sm501fb_init_fb() to the variable
> .devinit.data:sm501_default_mode
> The function sm501fb_init_fb() references
> the variable __devinitdata sm501_default_mode.
> This is often because sm501fb_init_fb lacks a __devinitdata
> annotation or the annotation of sm501_default_mode is wrong.
>
> WARNING: vmlinux.o(.text+0x1d557a): Section mismatch in reference from
> the function sm501fb_init_fb() to the variable
> .devinit.data:sm501_default_mode
> The function sm501fb_init_fb() references
> the variable __devinitdata sm501_default_mode.
> This is often because sm501fb_init_fb lacks a __devinitdata
> annotation or the annotation of sm501_default_mode is wrong.
>
> I've dropped the __devinitdata declaration in what I committed; can
> you investigate and post a fixup patch?

Of course, I look ASAP at it, thanks!
(Dummy question: where can I find your tree?)

bye,
Heiko
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany

2011-05-03 05:43:01

by Grant Likely

[permalink] [raw]
Subject: Re: [PATCH v6 0/6] powerpc, 52xx: add charon board support

On Mon, May 2, 2011 at 11:17 PM, Heiko Schocher <[email protected]> wrote:
> Hello Grant,
>
> Grant Likely wrote:
>> On Tue, Mar 22, 2011 at 09:27:26AM +0100, Heiko Schocher wrote:
>>> cc: Wolfram Sang <[email protected]>
>>> cc: Grant Likely <[email protected]>
>>> cc: Benjamin Herrenschmidt <[email protected]>
>>> cc: [email protected]
>>> cc: [email protected]
>>> cc: Ben Dooks <[email protected]>
>>> cc: Vincent Sanders <[email protected]>
>>> cc: Samuel Ortiz <[email protected]>
>>> cc: [email protected]
>>> cc: Randy Dunlap <[email protected]>
>>> cc: Wolfgang Denk <[email protected]>
>>> cc: Paul Mundt <[email protected]>
>>>
>>> changes since v5:
>>> - repost complete patchseries, as Paul Mundt suggested
>>> - rebased against current head
>>> - add Acked-by from Samuel Ortiz (MFD parts)
>>> ? http://www.spinics.net/lists/linux-fbdev/msg02550.html
>>> ? http://linux.derkeiler.com/Mailing-Lists/Kernel/2011-01/msg11798.html
>>>
>>> ? and Benjamin Herrenschmidt (DTS parts)
>>> ? http://lists.ozlabs.org/pipermail/linuxppc-dev/2011-February/088279.html
>>> - removed patch
>>> ? "powerpc, mpc5200: update mpc5200_defconfig to fit for charon board."
>>> ? therefore added
>>> ? "powerpc, tqm5200: update tqm5200_defconfig to fit for charon board."
>>
>> Refresh my memory, why was the mpc5200_defconfig updated dropped?
>
> Because it is a board based on the tqm5200 board port ... no other
> reason.

Please send a patch to also update the mpc5200_defconfig.

g.

2011-05-03 05:44:18

by Grant Likely

[permalink] [raw]
Subject: Re: [PATCH v6 3/6] video, sm501: add edid and commandline support

On Mon, May 2, 2011 at 11:27 PM, Heiko Schocher <[email protected]> wrote:
> Hello Grant,
>
> Grant Likely wrote:
>> On Mon, May 2, 2011 at 4:27 PM, Grant Likely <[email protected]> wrote:
>>> On Tue, Mar 22, 2011 at 09:27:29AM +0100, Heiko Schocher wrote:
>>>> - add commandline options:
>>>> ? sm501fb.mode:
>>>> ? ? Specify resolution as "<xres>x<yres>[-<bpp>][@<refresh>]"
>>>> ? sm501fb.bpp:
>>>> ? ? Specify bit-per-pixel if not specified mode
>>>>
>>>> - Add support for encoding display mode information
>>>> ? in the device tree using verbatim EDID block.
>>>>
>>>> ? If the "edid" entry in the "smi,sm501" node is present,
>>>> ? the driver will build mode database using EDID data
>>>> ? and allow setting the display modes from this database.
>>>>
>>>> Signed-off-by: Heiko Schocher <[email protected]>
>>> Merged, thanks.
>>
>> This patch causes the following build warning:
>
> Hups ... when I posted the patch, it compiled clean ...
>
>> ? MODPOST vmlinux.o
>> WARNING: vmlinux.o(.text+0x1d5572): Section mismatch in reference from
>> the function sm501fb_init_fb() to the variable
>> .devinit.data:sm501_default_mode
>> The function sm501fb_init_fb() references
>> the variable __devinitdata sm501_default_mode.
>> This is often because sm501fb_init_fb lacks a __devinitdata
>> annotation or the annotation of sm501_default_mode is wrong.
>>
>> WARNING: vmlinux.o(.text+0x1d557a): Section mismatch in reference from
>> the function sm501fb_init_fb() to the variable
>> .devinit.data:sm501_default_mode
>> The function sm501fb_init_fb() references
>> the variable __devinitdata sm501_default_mode.
>> This is often because sm501fb_init_fb lacks a __devinitdata
>> annotation or the annotation of sm501_default_mode is wrong.
>>
>> I've dropped the __devinitdata declaration in what I committed; can
>> you investigate and post a fixup patch?
>
> Of course, I look ASAP at it, thanks!
> (Dummy question: where can I find your tree?)

git://git.secretlab.ca/git/linux-2.6 powerpc/next

g.

>
> bye,
> Heiko
> --
> DENX Software Engineering GmbH, ? ? MD: Wolfgang Denk & Detlev Zundel
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
>



--
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.

2011-05-03 07:24:51

by Heiko Schocher

[permalink] [raw]
Subject: Re: [PATCH v6 0/6] powerpc, 52xx: add charon board support

Hello Grant,

Grant Likely wrote:
> On Mon, May 2, 2011 at 11:17 PM, Heiko Schocher <[email protected]> wrote:
>> Hello Grant,
>>
>> Grant Likely wrote:
>>> On Tue, Mar 22, 2011 at 09:27:26AM +0100, Heiko Schocher wrote:
>>>> cc: Wolfram Sang <[email protected]>
>>>> cc: Grant Likely <[email protected]>
>>>> cc: Benjamin Herrenschmidt <[email protected]>
>>>> cc: [email protected]
>>>> cc: [email protected]
>>>> cc: Ben Dooks <[email protected]>
>>>> cc: Vincent Sanders <[email protected]>
>>>> cc: Samuel Ortiz <[email protected]>
>>>> cc: [email protected]
>>>> cc: Randy Dunlap <[email protected]>
>>>> cc: Wolfgang Denk <[email protected]>
>>>> cc: Paul Mundt <[email protected]>
>>>>
>>>> changes since v5:
>>>> - repost complete patchseries, as Paul Mundt suggested
>>>> - rebased against current head
>>>> - add Acked-by from Samuel Ortiz (MFD parts)
>>>> http://www.spinics.net/lists/linux-fbdev/msg02550.html
>>>> http://linux.derkeiler.com/Mailing-Lists/Kernel/2011-01/msg11798.html
>>>>
>>>> and Benjamin Herrenschmidt (DTS parts)
>>>> http://lists.ozlabs.org/pipermail/linuxppc-dev/2011-February/088279.html
>>>> - removed patch
>>>> "powerpc, mpc5200: update mpc5200_defconfig to fit for charon board."
>>>> therefore added
>>>> "powerpc, tqm5200: update tqm5200_defconfig to fit for charon board."
>>> Refresh my memory, why was the mpc5200_defconfig updated dropped?
>> Because it is a board based on the tqm5200 board port ... no other
>> reason.
>
> Please send a patch to also update the mpc5200_defconfig.

Ok. Done, just one more question:

Why you didn;t pick up the patches:

- powerpc, 5200: add support for charon board
(Got an Acked-by from Wolfram Sang)
- powerpc, video: add SM501 support for charon board.

Are there any issues with them, I should fix?

bye,
Heiko
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany

2011-05-03 13:22:42

by Grant Likely

[permalink] [raw]
Subject: Re: [PATCH v6 0/6] powerpc, 52xx: add charon board support

On Tue, May 3, 2011 at 1:24 AM, Heiko Schocher <[email protected]> wrote:
>
> Ok. Done, just one more question:
>
> Why you didn;t pick up the patches:
>
> - powerpc, 5200: add support for charon board
> ?(Got an Acked-by from Wolfram Sang)
> - powerpc, video: add SM501 support for charon board.

I did pick them up and they are in my tree. Actually, I squashed
those two together since there was no reason to have them split apart.

g.