Skip to contentSkip to conversation

i2c: MPC837xRDB Power Management and GPIO expander driver

PATCH In review Anton Vorontsov 4 participants 6 messages Mar 26, 2008 – Mar 27, 2008 2 messages not in the archive

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

PATCH 4/5 i2c: MPC837xRDB Power Management and GPIO expander driver

On the MPC837xRDB boards there is MC9S08QG8 (MCU) chip with the custom firmware pre-programmed. This firmware offers to control some of the MCU GPIO pins via I2C (two pins, connected to the LEDs, but also available from the J28 and J43 headers, plus another (third) pin is a GPIO as well but on this board it is reserved for Power-Off function). MCU have some other functions, but these are not implemented yet.

---

This patch depends on the not yet applied OF/PowerPC GPIO patches, so please consider this for RFC only.

Thanks.

 drivers/i2c/chips/Kconfig          |    9 ++
 drivers/i2c/chips/Makefile         |    1 +
 drivers/i2c/chips/mcu_mpc837xrdb.c |  185 ++++++++++++++++++++++++++++++++++++
 3 files changed, 195 insertions(+), 0 deletions(-)
 create mode 100644 drivers/i2c/chips/mcu_mpc837xrdb.c
drivers/i2c/chips/Kconfig +9 -0
index 09d4937..db81018 100644
@@ -150,4 +150,13 @@ config OZ99X
 	  This driver can also be built as a module.  If so, the module
 	  will be called oz99x.
 
+config MCU_MPC837XRDB
+	tristate "MPC837XRDB MCU driver"
+	depends on I2C && MPC837x_RDB && OF_GPIO
+	help
+	  Say Y here to enable soft power-off functionality on the Freescale
+	  MPC837X-RDB boards, plus this driver will register MCU GPIOs as a
+	  generic GPIO API chip, so you'll able to use MCU1 and MCU2 as GPIOs
+	  and LEDs.
+
 endmenu
drivers/i2c/chips/Makefile +1 -0
index c69f891..bbe7495 100644
@@ -14,6 +14,7 @@ obj-$(CONFIG_TPS65010)		+= tps65010.o
 obj-$(CONFIG_MENELAUS)		+= menelaus.o
 obj-$(CONFIG_SENSORS_TSL2550)	+= tsl2550.o
 obj-$(CONFIG_OZ99X)		+= oz99x.o
+obj-$(CONFIG_MCU_MPC837XRDB)	+= mcu_mpc837xrdb.o
 
 ifeq ($(CONFIG_I2C_DEBUG_CHIP),y)
 EXTRA_CFLAGS += -DDEBUG
drivers/i2c/chips/mcu_mpc837xrdb.c new file +190 -0

190 lines not on this page · raw message

Signature · 7 lines
1.5.2.2


_______________________________________________
i2c mailing list
[email protected]
http://lists.lm-sensors.org/mailman/listinfo/i2c

A message that is not in the archive (sent off-list or not yet received): 20080326202511.GD1772-bi+AKbBUZKY6gyzm1THtWbp2dZbC/[email protected]

#2 lore raw

drivers/i2c/chips/Kconfig config OZ99X · line 155

Quoted 3 lines · Anton Vorontsov
drivers/i2c/chips/Kconfig +3 -0
+config MCU_MPC837XRDB
+	tristate "MPC837XRDB MCU driver"
+	depends on I2C && MPC837x_RDB && OF_GPIO

The MPC8349E-mITX also has this chip. Can you include support for that board as well?

Signature · 7 lines
Timur Tabi
Linux kernel developer at Freescale

_______________________________________________
i2c mailing list
[email protected]
http://lists.lm-sensors.org/mailman/listinfo/i2c

A message that is not in the archive (sent off-list or not yet received): [email protected]

#4 lore raw
Quoted 8 lines · Timur Tabi

drivers/i2c/chips/Kconfig config OZ99X · line 155

Quoted 3 lines · Anton Vorontsov
drivers/i2c/chips/Kconfig +3 -0
+config MCU_MPC837XRDB
+	tristate "MPC837XRDB MCU driver"
+	depends on I2C && MPC837x_RDB && OF_GPIO

The MPC8349E-mITX also has this chip. Can you include support for that board as well?

Well, only if it has the same (or compatible) firmware.. then yes.

Thanks for the info, I'll look into this.

Signature · 8 lines
Anton Vorontsov
email: [email protected]
irc://irc.freenode.net/bd2

_______________________________________________
i2c mailing list
[email protected]
http://lists.lm-sensors.org/mailman/listinfo/i2c
#5 lore raw
Quoted 11 lines · Anton Vorontsov
Quoted 8 lines · Timur Tabi

Review

Quoted 3 lines · Anton Vorontsov
(quoted diff) +3 -0
+config MCU_MPC837XRDB
+	tristate "MPC837XRDB MCU driver"
+	depends on I2C && MPC837x_RDB && OF_GPIO

The MPC8349E-mITX also has this chip. Can you include support for that board as well?

Well, only if it has the same (or compatible) firmware.. then yes.

Ok, they're the same and everything works fine. Except one mitx-specific thing though... on the power-off call I can see that MCU is driving its PTA1 pin low as expected, but the board doesn't turn off. PTA1 pin is wired to the J19 jumper pin1, pin2 is PORESET# and pin3 is RESET#. It doesn't work in both [1-2] and [2-3] positions...

This is surely not a software issue though. And just in case, on the board I have the PWR button isn't functional, so this is hw issues (or just need to find another jumper somewhere ;-).

Updated patch follows.

- - - -
From: Anton Vorontsov <[email protected]>
Subject: [POWERPC] mpc8349emitx/mpc837xrdb: add support for MCU

MCU is an external Freescale MC9S08QG8 microcontroller, mainly used to provide soft power-off function, but also exports two GPIOs (wired to the LEDs, but also available from the external headers).

---
 arch/powerpc/boot/dts/mpc8349emitx.dts    |   39 ++++++++++++++++++++++++++++-
 arch/powerpc/boot/dts/mpc8377_rdb.dts     |   29 ++++++++++++++++++++-
 arch/powerpc/boot/dts/mpc8378_rdb.dts     |   29 ++++++++++++++++++++-
 arch/powerpc/boot/dts/mpc8379_rdb.dts     |   29 ++++++++++++++++++++-
 arch/powerpc/platforms/83xx/mpc834x_itx.c |    1 +
 arch/powerpc/platforms/83xx/mpc837x_rdb.c |    1 +
 arch/powerpc/sysdev/fsl_soc.c             |    1 +
 7 files changed, 125 insertions(+), 4 deletions(-)
arch/powerpc/boot/dts/mpc8349emitx.dts +38 -1
index 9426676..0ad85af 100644
@@ -51,6 +51,8 @@
 	soc8349@e0000000 {
 		#address-cells = <1>;
 		#size-cells = <1>;
+		compatible = "fsl,immr-mpc8349e", "fsl,immr", "fsl,soc",
+			     "simple-bus";
 		device_type = "soc";
 		ranges = <0x0 0xe0000000 0x00100000>;
 		reg = <0xe0000000 0x00000200>;
@@ -66,11 +68,46 @@
 			#address-cells = <1>;
 			#size-cells = <0>;
 			cell-index = <0>;
-			compatible = "fsl-i2c";
+			compatible = "fsl-i2c", "simple-bus";
 			reg = <0x3000 0x100>;
 			interrupts = <14 0x8>;
 			interrupt-parent = <&ipic>;
 			dfsrr;
+
+			rtc@68 {
+				device_type = "rtc";
+				compatible = "dallas,ds1339";
+				reg = <0x68>;
+			};
+
+			mcu_pio: mcu@0a {
+				#address-cells = <0>;
+				#size-cells = <0>;
+				#gpio-cells = <1>;
+				compatible = "fsl,mc9s08qg8-mpc8349emitx",
+					     "fsl,mcu-mpc8349emitx",
+					     "simple-bus";
+				reg = <0x0a>;
+				gpio-controller;
+
+				led@0 {
+					compatible = "fsl,mcu-mpc8349emitx-led2",
+						     "gpio-led";
+					linux,name = "pwr";
+					linux,brightness = <1>;
+					linux,active-low;
+					gpios = <&mcu_pio 0>;
+				};
+
+				led@1 {
+					compatible = "fsl,mcu-mpc8349emitx-led1",
+						     "gpio-led";
+					linux,name = "hdd";
+					linux,default-trigger = "ide-disk";
+					linux,active-low;
+					gpios = <&mcu_pio 1>;
+				};
+			};
 		};
 
 		i2c@3100 {
arch/powerpc/boot/dts/mpc8377_rdb.dts +28 -1
index 440aa4d..20d7e29 100644
@@ -111,7 +111,7 @@
 			#address-cells = <1>;
 			#size-cells = <0>;
 			cell-index = <0>;
-			compatible = "fsl-i2c";
+			compatible = "fsl-i2c", "simple-bus";
 			reg = <0x3000 0x100>;
 			interrupts = <14 0x8>;
 			interrupt-parent = <&ipic>;
@@ -121,6 +121,33 @@
 				compatible = "dallas,ds1339";
 				reg = <0x68>;
 			};
+			mcu_pio: mcu@0a {
+				#address-cells = <0>;
+				#size-cells = <0>;
+				#gpio-cells = <1>;
+				compatible = "fsl,mc9s08qg8-mpc837xrdb",
+					     "fsl,mcu-mpc837xrdb",
+					     "fsl,mcu-mpc8349emitx",
+					     "simple-bus";
+				reg = <0x0a>;
+				gpio-controller;
+
+				led@0 {
+					compatible = "fsl,mcu-mpc837xrdb-led2",
+						     "gpio-led";
+					linux,name = "mcu2";
+					linux,active-low;
+					gpios = <&mcu_pio 0>;
+				};
+
+				led@1 {
+					compatible = "fsl,mcu-mpc837xrdb-led1",
+						     "gpio-led";
+					linux,name = "mcu1";
+					linux,active-low;
+					gpios = <&mcu_pio 1>;
+				};
+			};
 		};
 
 		i2c@3100 {
arch/powerpc/boot/dts/mpc8378_rdb.dts +28 -1
index 9271153..fdd2e9b 100644
@@ -111,7 +111,7 @@
 			#address-cells = <1>;
 			#size-cells = <0>;
 			cell-index = <0>;
-			compatible = "fsl-i2c";
+			compatible = "fsl-i2c", "simple-bus";
 			reg = <0x3000 0x100>;
 			interrupts = <14 0x8>;
 			interrupt-parent = <&ipic>;
@@ -121,6 +121,33 @@
 				compatible = "dallas,ds1339";
 				reg = <0x68>;
 			};
+			mcu_pio: mcu@0a {
+				#address-cells = <0>;
+				#size-cells = <0>;
+				#gpio-cells = <1>;
+				compatible = "fsl,mc9s08qg8-mpc837xrdb",
+					     "fsl,mcu-mpc837xrdb",
+					     "fsl,mcu-mpc8349emitx",
+					     "simple-bus";
+				reg = <0x0a>;
+				gpio-controller;
+
+				led@0 {
+					compatible = "fsl,mcu-mpc837xrdb-led2",
+						     "gpio-led";
+					linux,name = "mcu2";
+					linux,active-low;
+					gpios = <&mcu_pio 0>;
+				};
+
+				led@1 {
+					compatible = "fsl,mcu-mpc837xrdb-led1",
+						     "gpio-led";
+					linux,name = "mcu1";
+					linux,active-low;
+					gpios = <&mcu_pio 1>;
+				};
+			};
 		};
 
 		i2c@3100 {
arch/powerpc/boot/dts/mpc8379_rdb.dts +28 -1
index 0dda2fc..c7a0152 100644
@@ -111,7 +111,7 @@
 			#address-cells = <1>;
 			#size-cells = <0>;
 			cell-index = <0>;
-			compatible = "fsl-i2c";
+			compatible = "fsl-i2c", "simple-bus";
 			reg = <0x3000 0x100>;
 			interrupts = <14 0x8>;
 			interrupt-parent = <&ipic>;
@@ -121,6 +121,33 @@
 				compatible = "dallas,ds1339";
 				reg = <0x68>;
 			};
+			mcu_pio: mcu@0a {
+				#address-cells = <0>;
+				#size-cells = <0>;
+				#gpio-cells = <1>;
+				compatible = "fsl,mc9s08qg8-mpc837xrdb",
+					     "fsl,mcu-mpc837xrdb",
+					     "fsl,mcu-mpc8349emitx",
+					     "simple-bus";
+				reg = <0x0a>;
+				gpio-controller;
+
+				led@0 {
+					compatible = "fsl,mcu-mpc837xrdb-led2",
+						     "gpio-led";
+					linux,name = "mcu2";
+					linux,active-low;
+					gpios = <&mcu_pio 0>;
+				};
+
+				led@1 {
+					compatible = "fsl,mcu-mpc837xrdb-led1",
+						     "gpio-led";
+					linux,name = "mcu1";
+					linux,active-low;
+					gpios = <&mcu_pio 1>;
+				};
+			};
 		};
 
 		i2c@3100 {
arch/powerpc/platforms/83xx/mpc834x_itx.c +1 -0
index 50e8f63..1b3451c 100644
@@ -40,6 +40,7 @@
 
 static struct of_device_id __initdata mpc834x_itx_ids[] = {
 	{ .compatible = "fsl,pq2pro-localbus", },
+	{ .compatible = "simple-bus", },
 	{},
 };
 
arch/powerpc/platforms/83xx/mpc837x_rdb.c +1 -0
index 2293ae5..c00356b 100644
@@ -46,6 +46,7 @@ static void __init mpc837x_rdb_setup_arch(void)
 static struct of_device_id mpc837x_ids[] = {
 	{ .type = "soc", },
 	{ .compatible = "soc", },
+	{ .compatible = "simple-bus", },
 	{},
 };
 
arch/powerpc/sysdev/fsl_soc.c +1 -0
index 7ad9bce..e8fe369 100644
@@ -410,6 +410,7 @@ static struct i2c_driver_device i2c_devices[] __initdata = {
 	{"dallas,ds1340",  "rtc-ds1307",  "ds1340",},
 	{"stm,m41t00",     "rtc-ds1307",  "m41t00"},
 	{"dallas,ds1374",  "rtc-ds1374",  "rtc-ds1374",},
+	{"fsl,mcu-mpc8349emitx", "mcu-mpc8349emitx", "mcu-mpc8349emitx"},
 };
 
 static int __init of_find_i2c_driver(struct device_node *node,
Signature · 6 lines
1.5.2.2

_______________________________________________
i2c mailing list
[email protected]
http://lists.lm-sensors.org/mailman/listinfo/i2c
#6 lore raw
In reply to Anton Vorontsov
Quoted 7 lines · Anton Vorontsov

On the MPC837xRDB boards there is MC9S08QG8 (MCU) chip with the custom firmware pre-programmed. This firmware offers to control some of the MCU GPIO pins via I2C (two pins, connected to the LEDs, but also available from the J28 and J43 headers, plus another (third) pin is a GPIO as well but on this board it is reserved for Power-Off function). MCU have some other functions, but these are not implemented yet.

Quoted 7 lines

---

This patch depends on the not yet applied OF/PowerPC GPIO patches, so please consider this for RFC only.

Thanks.

Since the same chip with the identical firmware also found on the MPC8349E-mITXE board (thanks to Timur Tabi for noticing) here is an updated patch. MPC8349E-mITX board predates MPC837X-RDB boards, so I renamed this driver to mcu_mpc8349emitx.

- - - -
From: Anton Vorontsov <[email protected]>
Subject: i2c: MPC8349E-mITX/MPC837x-RDB Power Management and GPIO expander driver

On the MPC8349E-mITX and MPC837x-RDB boards there is MC9S08QG8 (MCU) chip with the custom firmware pre-programmed. This firmware offers to control some of the MCU GPIO pins (used for LEDs and soft power-off) via I2C. MCU have some other functions, but these are not implemented yet.

---
 drivers/i2c/chips/Kconfig            |   11 ++
 drivers/i2c/chips/Makefile           |    1 +
 drivers/i2c/chips/mcu_mpc8349emitx.c |  189 ++++++++++++++++++++++++++++++++++
 3 files changed, 201 insertions(+), 0 deletions(-)
 create mode 100644 drivers/i2c/chips/mcu_mpc8349emitx.c
drivers/i2c/chips/Kconfig +11 -0
index 09d4937..d3e3bfb 100644
@@ -150,4 +150,15 @@ config OZ99X
 	  This driver can also be built as a module.  If so, the module
 	  will be called oz99x.
 
+config MCU_MPC8349EMITX
+	tristate "MPC8349E-mITX/MPC837X-RDB MCU driver"
+	depends on I2C && (MPC834x_ITX || MPC837x_RDB)
+	select GENERIC_GPIO
+	select HAVE_GPIO_LIB
+	help
+	  Say Y here to enable soft power-off functionality on the Freescale
+	  MPC8349E-mITX and MPC837X-RDB boards, plus this driver will register
+	  MCU GPIOs as a generic GPIO API chip, so you'll able to use some MCU
+	  pins as a GPIOs and LEDs.
+
 endmenu
drivers/i2c/chips/Makefile +1 -0
index c69f891..89c92df 100644
@@ -14,6 +14,7 @@ obj-$(CONFIG_TPS65010)		+= tps65010.o
 obj-$(CONFIG_MENELAUS)		+= menelaus.o
 obj-$(CONFIG_SENSORS_TSL2550)	+= tsl2550.o
 obj-$(CONFIG_OZ99X)		+= oz99x.o
+obj-$(CONFIG_MCU_MPC8349EMITX)	+= mcu_mpc8349emitx.o
 
 ifeq ($(CONFIG_I2C_DEBUG_CHIP),y)
 EXTRA_CFLAGS += -DDEBUG
drivers/i2c/chips/mcu_mpc8349emitx.c new file +189 -0

189 lines not on this page · raw message

Signature · 1 line
1.5.2.2
#7 lore raw

Incidentally I used some weird .config without preemption and CONFIG_ENABLE_MUST_CHECK. Heh.

[...]

drivers/i2c/chips/mcu_mpc8349emitx.c line 36

Quoted 10 lines

+ * I don't have specifications for the MCU firmware that is used on the
+ * MPC8349E-mITX/MPC837XRDB boards, I found this register and bits positions
+ * by the trial&error method.
+ */

drivers/i2c/chips/mcu_mpc8349emitx.c new file +6 -0
+#define MCU_REG_CTRL	0x20
+#define MCU_CTRL_POFF	0x40
+#define MCU_NUM_GPIO	2
+
+struct mcu {
+	spinlock_t lock;

This should be mutex of course, otherwise preemptable kernel will complain.

[...]

drivers/i2c/chips/mcu_mpc8349emitx.c line 109

Quoted 1 line
drivers/i2c/chips/mcu_mpc8349emitx.c new file +1 -0
+	gpiochip_remove(&mcu->of_gc.gc);

Should check return value.

Signature · 3 lines
Anton Vorontsov
email: [email protected]
irc://irc.freenode.net/bd2