From 938c3c293884822a5e07f5adf4b711226855b71b Mon Sep 17 00:00:00 2001 From: Radek Polak Date: Tue, 21 Sep 2010 20:03:14 +0200 Subject: [PATCH 28/28] GTA02 bt - remember state of bluetooth in variable Reading bt status before suspend for some reason does not work. It always resumes with bluetooth turned off. This patch remembers if bluetooth is switched on/off in variable and after resume bluetooth ends up in the same state as was before suspend. Signed-off-by: Martin Jansa --- arch/arm/mach-s3c2442/gta02-pm-bt.c | 18 +++++++++++------- 1 files changed, 11 insertions(+), 7 deletions(-) diff --git a/arch/arm/mach-s3c2442/gta02-pm-bt.c b/arch/arm/mach-s3c2442/gta02-pm-bt.c index 8bb2a12..ce87087 100644 --- a/arch/arm/mach-s3c2442/gta02-pm-bt.c +++ b/arch/arm/mach-s3c2442/gta02-pm-bt.c @@ -53,7 +53,8 @@ static ssize_t bt_read(struct device *dev, struct device_attribute *attr, } } -static void __gta02_pm_bt_toggle_radio(struct device *dev, unsigned int on) +static void __gta02_pm_bt_toggle_radio(struct device *dev, unsigned int on, + bool remember_state) { struct gta02_pm_bt_data *bt_data = dev_get_drvdata(dev); @@ -72,6 +73,9 @@ static void __gta02_pm_bt_toggle_radio(struct device *dev, unsigned int on) } s3c2410_gpio_setpin(GTA02_GPIO_BT_EN, on); + + if (remember_state) + bt_data->pre_resume_state = on; } @@ -79,7 +83,7 @@ static int bt_rfkill_set_block(void *data, bool blocked) { struct device *dev = data; - __gta02_pm_bt_toggle_radio(dev, !blocked); + __gta02_pm_bt_toggle_radio(dev, !blocked, true); return 0; } @@ -98,7 +102,7 @@ static ssize_t bt_write(struct device *dev, struct device_attribute *attr, if (!strcmp(attr->attr.name, "power_on")) { rfkill_set_sw_state(bt_data->rfkill, on ? 1 : 0); - __gta02_pm_bt_toggle_radio(dev, on); + __gta02_pm_bt_toggle_radio(dev, on, true); } else if (!strcmp(attr->attr.name, "reset")) { /* reset is low-active, so we need to invert */ s3c2410_gpio_setpin(GTA02_GPIO_BT_EN, on ? 0 : 1); @@ -113,12 +117,12 @@ static DEVICE_ATTR(reset, 0644, bt_read, bt_write); #ifdef CONFIG_PM static int gta02_bt_suspend(struct platform_device *pdev, pm_message_t state) { - struct gta02_pm_bt_data *bt_data = dev_get_drvdata(&pdev->dev); +/* struct gta02_pm_bt_data *bt_data = dev_get_drvdata(&pdev->dev); */ dev_dbg(&pdev->dev, DRVMSG ": suspending\n"); - bt_data->pre_resume_state = s3c2410_gpio_getpin(GTA02_GPIO_BT_EN); - __gta02_pm_bt_toggle_radio(&pdev->dev, 0); + /* bt_data->pre_resume_state = s3c2410_gpio_getpin(GTA02_GPIO_BT_EN); */ + __gta02_pm_bt_toggle_radio(&pdev->dev, 0, false); return 0; } @@ -128,7 +132,7 @@ static int gta02_bt_resume(struct platform_device *pdev) struct gta02_pm_bt_data *bt_data = dev_get_drvdata(&pdev->dev); dev_dbg(&pdev->dev, DRVMSG ": resuming\n"); - __gta02_pm_bt_toggle_radio(&pdev->dev, bt_data->pre_resume_state); + __gta02_pm_bt_toggle_radio(&pdev->dev, bt_data->pre_resume_state, false); return 0; } #else -- 1.7.3