summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNitin Garg <nitin.garg@freescale.com>2012-02-15 18:10:02 -0600
committerNitin Garg <nitin.garg@freescale.com>2012-02-15 18:10:02 -0600
commit8db0d7aedb35773a1319bd5029beeb7f2f5e9833 (patch)
treeefe295645ed2fc2c5f6a9471a30c1468c8f7d31c
parent1af7a6f27a945a38ebbd9dee7f0d733eb5242adc (diff)
ENGR00174591: Fix the max17085 battery sensor
This commit fixes the max17085 3-cell battery sensor and some code cleanup in SDHC, AMD-GPU, Regulators, RTC. Signed-off-by: Nitin Garg <nitin.garg@freescale.com>
-rw-r--r--drivers/misc/pmem.c3
-rw-r--r--drivers/mmc/host/sdhci.c36
-rw-r--r--drivers/mxc/amd-gpu/platform/hal/linux/gsl_kmod_cleanup.c11
-rw-r--r--drivers/power/max17085_battery.c24
-rw-r--r--drivers/regulator/core.c2
-rw-r--r--drivers/rtc/rtc-da9052.c4
-rw-r--r--include/linux/rfkill.h31
-rw-r--r--net/rfkill/core.c14
8 files changed, 93 insertions, 32 deletions
diff --git a/drivers/misc/pmem.c b/drivers/misc/pmem.c
index 3027618a6a9f..5c7bca0d309c 100644
--- a/drivers/misc/pmem.c
+++ b/drivers/misc/pmem.c
@@ -1,7 +1,7 @@
/* drivers/android/pmem.c
*
* Copyright (C) 2007 Google, Inc.
- * Copyright (C) 2011 Freescale Semiconductor, Inc.
+ * Copyright (C) 2011-2012 Freescale Semiconductor, Inc.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
@@ -33,6 +33,7 @@
#define PMEM_MAX_ORDER 128
#define PMEM_MIN_ALLOC PAGE_SIZE
+/*#define PMEM_VADDR_SUPPORT*/
#define PMEM_DEBUG 1
/* indicates that a refernce to this file has been taken via get_pmem_file,
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index c051ea791e95..3c4c9e4fe40a 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -50,14 +50,11 @@ static void sdhci_finish_command(struct sdhci_host *);
static void sdhci_clk_worker(struct work_struct *work)
{
- unsigned long flags;
struct sdhci_host *host =
container_of(work, struct sdhci_host, clk_worker.work);
- spin_lock_irqsave(&host->lock, flags);
if (host->ops->platform_clk_ctrl && host->clk_status)
host->ops->platform_clk_ctrl(host, false);
- spin_unlock_irqrestore(&host->lock, flags);
}
static inline bool sdhci_is_sdio_attached(struct sdhci_host *host)
@@ -290,16 +287,16 @@ static void sdhci_led_control(struct led_classdev *led,
struct sdhci_host *host = container_of(led, struct sdhci_host, led);
unsigned long flags;
- spin_lock_irqsave(&host->lock, flags);
sdhci_enable_clk(host);
+ spin_lock_irqsave(&host->lock, flags);
if (brightness == LED_OFF)
sdhci_deactivate_led(host);
else
sdhci_activate_led(host);
- sdhci_disable_clk(host, CLK_TIMEOUT);
spin_unlock_irqrestore(&host->lock, flags);
+ sdhci_disable_clk(host, CLK_TIMEOUT);
}
#endif
@@ -1041,6 +1038,12 @@ static void sdhci_finish_command(struct sdhci_host *host)
if (!host->cmd->data)
tasklet_schedule(&host->finish_tasklet);
+ /*
+ * Some delay is mandatory required between CMD6 and CMD13 after
+ * switch to DDR mode when Sandisk eMMC44 soldered on SMD board
+ */
+ if (host->cmd->opcode == 0x6)
+ mdelay(5);
host->cmd = NULL;
}
@@ -1182,6 +1185,7 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
host = mmc_priv(mmc);
+ sdhci_enable_clk(host);
spin_lock_irqsave(&host->lock, flags);
WARN_ON(host->mrq != NULL);
@@ -1197,7 +1201,6 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
}
host->mrq = mrq;
- sdhci_enable_clk(host);
/* If polling, assume that the card is always present. */
if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION)
@@ -1224,8 +1227,8 @@ static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
host = mmc_priv(mmc);
- spin_lock_irqsave(&host->lock, flags);
sdhci_enable_clk(host);
+ spin_lock_irqsave(&host->lock, flags);
if (host->flags & SDHCI_DEVICE_DEAD)
goto out;
@@ -1301,10 +1304,10 @@ static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
out:
mmiowb();
+ spin_unlock_irqrestore(&host->lock, flags);
+
if (ios->power_mode == MMC_POWER_OFF)
sdhci_disable_clk(host, 0);
-
- spin_unlock_irqrestore(&host->lock, flags);
}
static int sdhci_get_ro(struct mmc_host *mmc)
@@ -1315,8 +1318,8 @@ static int sdhci_get_ro(struct mmc_host *mmc)
host = mmc_priv(mmc);
- spin_lock_irqsave(&host->lock, flags);
sdhci_enable_clk(host);
+ spin_lock_irqsave(&host->lock, flags);
if (host->flags & SDHCI_DEVICE_DEAD)
is_readonly = 0;
@@ -1327,6 +1330,7 @@ static int sdhci_get_ro(struct mmc_host *mmc)
& SDHCI_WRITE_PROTECT);
spin_unlock_irqrestore(&host->lock, flags);
+ sdhci_disable_clk(host, CLK_TIMEOUT);
/* This quirk needs to be replaced by a callback-function later */
return host->quirks & SDHCI_QUIRK_INVERTED_WRITE_PROTECT ?
@@ -1340,8 +1344,8 @@ static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable)
host = mmc_priv(mmc);
- spin_lock_irqsave(&host->lock, flags);
sdhci_enable_clk(host);
+ spin_lock_irqsave(&host->lock, flags);
if (host->flags & SDHCI_DEVICE_DEAD)
goto out;
@@ -1450,8 +1454,8 @@ static void sdhci_tasklet_finish(unsigned long param)
#endif
mmiowb();
- sdhci_disable_clk(host, CLK_TIMEOUT);
spin_unlock_irqrestore(&host->lock, flags);
+ sdhci_disable_clk(host, CLK_TIMEOUT);
mmc_request_done(host->mmc, mrq);
}
@@ -1610,8 +1614,9 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
host->data->error = -EIO;
}
- if (host->data->error)
+ if (host->data->error) {
sdhci_finish_data(host);
+ }
else {
if (intmask & (SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL))
sdhci_transfer_pio(host);
@@ -1759,7 +1764,7 @@ int sdhci_resume_host(struct sdhci_host *host)
int ret;
if (host->vmmc) {
- int ret = regulator_enable(host->vmmc);
+ ret = regulator_enable(host->vmmc);
if (ret)
return ret;
}
@@ -2157,6 +2162,8 @@ void sdhci_remove_host(struct sdhci_host *host, int dead)
{
unsigned long flags;
+ sdhci_enable_clk(host);
+
if (dead) {
spin_lock_irqsave(&host->lock, flags);
@@ -2167,7 +2174,6 @@ void sdhci_remove_host(struct sdhci_host *host, int dead)
" transfer!\n", mmc_hostname(host->mmc));
host->mrq->cmd->error = -ENOMEDIUM;
- sdhci_enable_clk(host);
tasklet_schedule(&host->finish_tasklet);
}
diff --git a/drivers/mxc/amd-gpu/platform/hal/linux/gsl_kmod_cleanup.c b/drivers/mxc/amd-gpu/platform/hal/linux/gsl_kmod_cleanup.c
index 3685a5756baf..911469b720d7 100644
--- a/drivers/mxc/amd-gpu/platform/hal/linux/gsl_kmod_cleanup.c
+++ b/drivers/mxc/amd-gpu/platform/hal/linux/gsl_kmod_cleanup.c
@@ -173,10 +173,13 @@ int del_all_memblocks_from_allocated_list(struct file *fd)
printk(KERN_INFO "Not all allocated memory blocks were freed. Doing it now.\n");
list_for_each_entry_safe(cursor, next, head, node)
{
- printk(KERN_INFO "Freeing list entry #%u, gpuaddr=%x\n", (u32)cursor->allocation_number, cursor->allocated_block.gpuaddr);
- kgsl_sharedmem_free(&cursor->allocated_block);
- list_del(&cursor->node);
- kfree(cursor);
+ printk(KERN_DEBUG "Freeing list entry #%u, gpuaddr=%x\n",
+ (u32)cursor->allocation_number,
+ cursor->allocated_block.gpuaddr);
+
+ kgsl_sharedmem_free(&cursor->allocated_block);
+ list_del(&cursor->node);
+ kfree(cursor);
}
}
diff --git a/drivers/power/max17085_battery.c b/drivers/power/max17085_battery.c
index 60e653031a81..f41d31352293 100644
--- a/drivers/power/max17085_battery.c
+++ b/drivers/power/max17085_battery.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright (C) 2011-2012 Freescale Semiconductor, Inc. All Rights Reserved.
*/
/*
@@ -169,12 +169,16 @@ static void max17085_get_health(struct max17085_chip *chip)
}
extern int da9052_adc_read(unsigned char channel);
-#define VOLT_REG_TO_MV(val) ((val * 2500) / 1024)
+#define VOLT_REG_TO_MV(val) ((val * 2500) / 1024)
#define BATT_TO_ADC_SCALE 11
+#define DA9052_ADCMAN_ADCIN6 6
static void max17085_get_volt(struct max17085_chip *chip)
{
int val;
- val = da9052_adc_read(6);
+ val = da9052_adc_read(DA9052_ADCMAN_ADCIN6);
+
+ /* Ignore lower 2 bits out of 10 bits due to noise */
+ val = val & 0x3fc;
if (val > 0)
chip->voltage_uV = VOLT_REG_TO_MV(val)*1000*BATT_TO_ADC_SCALE;
else
@@ -182,7 +186,7 @@ static void max17085_get_volt(struct max17085_chip *chip)
}
#define BATT_EMPTY_MV 9955
-#define BATT_FULL_MV 11500
+#define BATT_FULL_MV 12000
static void max17085_get_cap(struct max17085_chip *chip)
{
int old_cap = chip->cap;
@@ -360,18 +364,20 @@ static int max17085_bat_remove(struct platform_device *pdev)
static void max17085_bat_shutdown(struct platform_device *pdev)
{
- struct max17085_chip *chip = platform_get_drvdata(pdev);
+ struct max17085_chip *chip = platform_get_drvdata(pdev);
- cancel_delayed_work_sync(&chip->work);
+ cancel_delayed_work_sync(&chip->work);
+ gpio_set_value(chip->charge_now, 0);
+ gpio_set_value(chip->charge_done, 0);
}
static struct platform_driver max17085_bat_driver = {
- .driver = {
- .name = "max17085_bat",
- },
.probe = max17085_bat_probe,
.remove = max17085_bat_remove,
.shutdown = max17085_bat_shutdown,
+ .driver = {
+ .name = "max17085_bat",
+ },
};
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index bcb955ed1959..6530589bb58a 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -744,7 +744,7 @@ static void print_constraints(struct regulator_dev *rdev)
if (constraints->valid_modes_mask & REGULATOR_MODE_STANDBY)
count += sprintf(buf + count, "standby");
- rdev_info(rdev, "%s\n", buf);
+ rdev_dbg(rdev, "%s\n", buf);
}
static int machine_constraints_voltage(struct regulator_dev *rdev,
diff --git a/drivers/rtc/rtc-da9052.c b/drivers/rtc/rtc-da9052.c
index 952a106ebb19..3ae835bfbe61 100644
--- a/drivers/rtc/rtc-da9052.c
+++ b/drivers/rtc/rtc-da9052.c
@@ -53,10 +53,10 @@ void da9052_rtc_notifier(struct da9052_eh_nb *eh_data, unsigned int event)
if (msg.data & DA9052_ALARMMI_ALARMTYPE) {
da9052_rtc_enable_alarm(rtc->da9052, 0);
- printk(KERN_INFO "RTC: TIMER ALARM\n");
+ pr_debug("RTC: TIMER ALARM\n");
} else {
kobject_uevent(&rtc->rtc->dev.kobj, KOBJ_CHANGE);
- printk(KERN_INFO "RTC: TICK ALARM\n");
+ pr_debug("RTC: TICK ALARM\n");
}
}
diff --git a/include/linux/rfkill.h b/include/linux/rfkill.h
index c6c608482cba..08c32e4f261a 100644
--- a/include/linux/rfkill.h
+++ b/include/linux/rfkill.h
@@ -354,6 +354,37 @@ static inline bool rfkill_blocked(struct rfkill *rfkill)
}
#endif /* RFKILL || RFKILL_MODULE */
+
+#ifdef CONFIG_RFKILL_LEDS
+/**
+ * rfkill_get_led_trigger_name - Get the LED trigger name for the button's LED.
+ * This function might return a NULL pointer if registering of the
+ * LED trigger failed. Use this as "default_trigger" for the LED.
+ */
+const char *rfkill_get_led_trigger_name(struct rfkill *rfkill);
+
+/**
+ * rfkill_set_led_trigger_name -- set the LED trigger name
+ * @rfkill: rfkill struct
+ * @name: LED trigger name
+ *
+ * This function sets the LED trigger name of the radio LED
+ * trigger that rfkill creates. It is optional, but if called
+ * must be called before rfkill_register() to be effective.
+ */
+void rfkill_set_led_trigger_name(struct rfkill *rfkill, const char *name);
+#else
+static inline const char *rfkill_get_led_trigger_name(struct rfkill *rfkill)
+{
+ return NULL;
+}
+
+static inline void
+rfkill_set_led_trigger_name(struct rfkill *rfkill, const char *name)
+{
+}
+#endif
+
#endif /* __KERNEL__ */
#endif /* RFKILL_H */
diff --git a/net/rfkill/core.c b/net/rfkill/core.c
index dafeaeb97bc3..b91741911863 100644
--- a/net/rfkill/core.c
+++ b/net/rfkill/core.c
@@ -149,6 +149,20 @@ static void rfkill_led_trigger_activate(struct led_classdev *led)
rfkill_led_trigger_event(rfkill);
}
+const char *rfkill_get_led_trigger_name(struct rfkill *rfkill)
+{
+ return rfkill->led_trigger.name;
+}
+EXPORT_SYMBOL(rfkill_get_led_trigger_name);
+
+void rfkill_set_led_trigger_name(struct rfkill *rfkill, const char *name)
+{
+ BUG_ON(!rfkill);
+
+ rfkill->ledtrigname = name;
+}
+EXPORT_SYMBOL(rfkill_set_led_trigger_name);
+
static int rfkill_led_trigger_register(struct rfkill *rfkill)
{
rfkill->led_trigger.name = rfkill->ledtrigname