serial: ifx6x60: Add modem power off function in the platform reboot process
PATCH 1/1 serial: ifx6x60: Add modem power off function in the platform reboot process
This patch add modem power off function in the reboot process according registering reboot callback to the reboot_notifier_list. Also realizing the spi shutdown function.
--- drivers/tty/serial/ifx6x60.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 files changed, 39 insertions(+), 0 deletions(-)
drivers/tty/serial/ifx6x60.c +39 -0
@@ -60,6 +60,7 @@#include <linux/pm_runtime.h> #include <linux/spi/ifx_modem.h> #include <linux/delay.h> +#include <linux/reboot.h> #include "ifx6x60.h"
@@ -72,8 +73,14 @@#define IFX_SPI_HEADER_0 (-1)#define IFX_SPI_HEADER_F (-2) +#define PO_POST_DELAY 200 +#define IFX_MDM_RST_PMU 4 +/* forward reference */ static void ifx_spi_handle_srdy (struct ifx_spi_device *ifx_dev); +static int ifx_modem_reboot_callback (struct notifier_block *nfb, +unsigned long event,void *data); +static int ifx_modem_power_off (struct ifx_spi_device *ifx_dev);/* local variables */ static int spi_bpw =16 ;/* 8, 16 or 32 bit word length */
@@ -81,6 +88,29 @@ static struct tty_driver *tty_drv;static struct ifx_spi_device *saved_ifx_dev;static struct lock_class_key ifx_spi_key; +static struct notifier_block ifx_modem_reboot_notifier_block = { + .notifier_call = ifx_modem_reboot_callback, +}; + +static int ifx_modem_power_off (struct ifx_spi_device *ifx_dev) +{ +gpio_set_value (IFX_MDM_RST_PMU ,1 ); +msleep (PO_POST_DELAY ); + +return 0 ; +} + +static int ifx_modem_reboot_callback (struct notifier_block *nfb, +unsigned long event,void *data) +{ +if (saved_ifx_dev) +ifx_modem_power_off (saved_ifx_dev); +else +pr_warn ("no ifx modem active \n" ); + +return NOTIFY_OK ; +} +/* GPIO/GPE settings */ /**
@@ -1219,6 +1249,9 @@ static int ifx_spi_spi_remove(struct spi_device *spi)static void ifx_spi_spi_shutdown (struct spi_device *spi) { +struct ifx_spi_device *ifx_dev =spi_get_drvdata (spi); + +ifx_modem_power_off (ifx_dev); }/*
@@ -1368,6 +1401,7 @@ static void __exit ifx_spi_exit(void)static int __init ifx_spi_init (void ) {int result; +int ret; tty_drv =alloc_tty_driver (1 );if (!tty_drv) {
@@ -1399,6 +1433,11 @@ static int __init ifx_spi_init(void) DRVNAME, result);tty_unregister_driver (tty_drv); } + + ret =register_reboot_notifier (&ifx_modem_reboot_notifier_block); +if (ret) +pr_err ("cannot register reboot notifier (err=%d)\n" , ret); +return result; }
Signature · 1 line
1.7.4.1
Quoted 4 lines · On Thu, 22 Nov 2012 06:19:23 -0500 Jun Chen <[email protected]> wrote:
This patch add modem power off function in the reboot process according registering reboot callback to the
reboot_notifier_list. Also realizing the spi shutdown function.
Need to unregister the reboot notifier in the ifx_spi_exit path. If the driver module is unloaded you leave the callback present and the kernel will call into freed memory.
Alan
Quoted 8 lines · Alan Cox
Quoted 4 lines · On Thu, 22 Nov 2012 06:19:23 -0500 Jun Chen <[email protected]> wrote:
This patch add modem power off function in the reboot process according registering reboot callback to the
reboot_notifier_list. Also realizing the spi shutdown function.
Quoted 5 lines
Need to unregister the reboot notifier in the
ifx_spi_exitpath. If the driver module is unloaded you leave the callback present and the kernel will call into freed memory.Alan
Yes,thanks! I will update this patch again.