From 409ed358cf9f2d5c46b41791e5bcafd4b501e009 Mon Sep 17 00:00:00 2001 From: Sameer Thalappil Date: Wed, 7 Dec 2011 10:53:31 -0800 Subject: [PATCH] wcnss: Proxy vote for Iris regulators on behalf of Riva This patch includes the following changes, a. Proxy vote for Iris regulators on behalf of Riva. b. During SSR power-on, vote for Iris regulators just like in cold boot. c. Remove wcnss_riva.h, it was meant to be local to platform driver. d. Make WCNSS platform driver part of kernel Change-Id: Ied1f91297305469a0e4d9e524a03b49e1f600852 Signed-off-by: Sameer Thalappil --- arch/arm/configs/msm8960_defconfig | 2 +- arch/arm/mach-msm/wcnss-ssr-8960.c | 26 ++++++++++++++++++--- drivers/net/wireless/wcnss/wcnss_riva.c | 2 +- drivers/net/wireless/wcnss/wcnss_riva.h | 31 ------------------------- drivers/net/wireless/wcnss/wcnss_wlan.c | 17 +++++++++++++- include/linux/wcnss_wlan.h | 14 +++++++++++ 6 files changed, 55 insertions(+), 37 deletions(-) delete mode 100644 drivers/net/wireless/wcnss/wcnss_riva.h diff --git a/arch/arm/configs/msm8960_defconfig b/arch/arm/configs/msm8960_defconfig index 47e3c419405..bb94d2a6fe1 100644 --- a/arch/arm/configs/msm8960_defconfig +++ b/arch/arm/configs/msm8960_defconfig @@ -235,7 +235,7 @@ CONFIG_SMSC911X=y CONFIG_KS8851=m # CONFIG_NETDEV_1000 is not set # CONFIG_NETDEV_10000 is not set -CONFIG_WCNSS_CORE=m +CONFIG_WCNSS_CORE=y CONFIG_USB_USBNET=y CONFIG_SLIP=y CONFIG_SLIP_COMPRESSED=y diff --git a/arch/arm/mach-msm/wcnss-ssr-8960.c b/arch/arm/mach-msm/wcnss-ssr-8960.c index 18b73341faf..af92d220665 100644 --- a/arch/arm/mach-msm/wcnss-ssr-8960.c +++ b/arch/arm/mach-msm/wcnss-ssr-8960.c @@ -17,6 +17,8 @@ #include #include #include +#include +#include #include #include #include @@ -79,14 +81,32 @@ static void smsm_riva_reset(void) /* Subsystem handlers */ static int riva_shutdown(const struct subsys_data *subsys) { + struct platform_device *pdev = wcnss_get_platform_device(); + struct wcnss_wlan_config *pwlanconfig = wcnss_get_wlan_config(); + int ret = -1; + pil_force_shutdown("wcnss"); - return 0; + + /* proxy vote on behalf of Riva */ + if (pdev && pwlanconfig) + ret = wcnss_wlan_power(&pdev->dev, pwlanconfig, + WCNSS_WLAN_SWITCH_OFF); + return ret; } static int riva_powerup(const struct subsys_data *subsys) { - pil_force_boot("wcnss"); - return 0; + struct platform_device *pdev = wcnss_get_platform_device(); + struct wcnss_wlan_config *pwlanconfig = wcnss_get_wlan_config(); + int ret = -1; + + if (pdev && pwlanconfig) + ret = wcnss_wlan_power(&pdev->dev, pwlanconfig, + WCNSS_WLAN_SWITCH_ON); + if (!ret) + pil_force_boot("wcnss"); + + return ret; } /* RAM segments for Riva SS; diff --git a/drivers/net/wireless/wcnss/wcnss_riva.c b/drivers/net/wireless/wcnss/wcnss_riva.c index 9f69f125b47..b0eac55b8fa 100644 --- a/drivers/net/wireless/wcnss/wcnss_riva.c +++ b/drivers/net/wireless/wcnss/wcnss_riva.c @@ -18,10 +18,10 @@ #include #include #include +#include #include #include -#include "wcnss_riva.h" static void __iomem *msm_riva_base; static struct msm_xo_voter *wlan_clock; diff --git a/drivers/net/wireless/wcnss/wcnss_riva.h b/drivers/net/wireless/wcnss/wcnss_riva.h deleted file mode 100644 index e037f587655..00000000000 --- a/drivers/net/wireless/wcnss/wcnss_riva.h +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (c) 2011, Code Aurora Forum. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _WCNSS_RIVA_H_ -#define _WCNSS_RIVA_H_ - -#include - -enum wcnss_opcode { - WCNSS_WLAN_SWITCH_OFF = 0, - WCNSS_WLAN_SWITCH_ON, -}; - -struct wcnss_wlan_config { - int use_48mhz_xo; -}; - -int wcnss_wlan_power(struct device *dev, - struct wcnss_wlan_config *cfg, - enum wcnss_opcode opcode); - -#endif /* _WCNSS_RIVA_H_ */ diff --git a/drivers/net/wireless/wcnss/wcnss_wlan.c b/drivers/net/wireless/wcnss/wcnss_wlan.c index 74530686c26..72174341f40 100644 --- a/drivers/net/wireless/wcnss/wcnss_wlan.c +++ b/drivers/net/wireless/wcnss/wcnss_wlan.c @@ -22,7 +22,6 @@ #include #include #include -#include "wcnss_riva.h" #define DEVICE "wcnss_wlan" #define VERSION "1.01" @@ -128,6 +127,22 @@ struct device *wcnss_wlan_get_device(void) } EXPORT_SYMBOL(wcnss_wlan_get_device); +struct platform_device *wcnss_get_platform_device(void) +{ + if (penv && penv->pdev) + return penv->pdev; + return NULL; +} +EXPORT_SYMBOL(wcnss_get_platform_device); + +struct wcnss_wlan_config *wcnss_get_wlan_config(void) +{ + if (penv && penv->pdev) + return &penv->wlan_config; + return NULL; +} +EXPORT_SYMBOL(wcnss_get_wlan_config); + struct resource *wcnss_wlan_get_memory_map(struct device *dev) { if (penv && dev && (dev == &penv->pdev->dev) && penv->smd_channel_ready) diff --git a/include/linux/wcnss_wlan.h b/include/linux/wcnss_wlan.h index 3b37f85ec09..02c0b958745 100644 --- a/include/linux/wcnss_wlan.h +++ b/include/linux/wcnss_wlan.h @@ -16,6 +16,15 @@ #include +enum wcnss_opcode { + WCNSS_WLAN_SWITCH_OFF = 0, + WCNSS_WLAN_SWITCH_ON, +}; + +struct wcnss_wlan_config { + int use_48mhz_xo; +}; + #define WCNSS_WLAN_IRQ_INVALID -1 struct device *wcnss_wlan_get_device(void); @@ -26,6 +35,11 @@ void wcnss_wlan_register_pm_ops(struct device *dev, const struct dev_pm_ops *pm_ops); void wcnss_wlan_unregister_pm_ops(struct device *dev, const struct dev_pm_ops *pm_ops); +struct platform_device *wcnss_get_platform_device(void); +struct wcnss_wlan_config *wcnss_get_wlan_config(void); +int wcnss_wlan_power(struct device *dev, + struct wcnss_wlan_config *cfg, + enum wcnss_opcode opcode); #define wcnss_wlan_get_drvdata(dev) dev_get_drvdata(dev) #define wcnss_wlan_set_drvdata(dev, data) dev_set_drvdata((dev), (data))