i2c: MPC837xRDB Power Management and GPIO expander driver
Subsystems (4)
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
@@ -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
@@ -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]
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]
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_GPIOThe 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
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_GPIOThe 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
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
Signed-off-by Anton Vorontsov <[email protected]>---
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
@@ -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
@@ -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
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