diff options
author | Nitin Garg <nitin.garg@freescale.com> | 2012-02-15 18:10:02 -0600 |
---|---|---|
committer | Nitin Garg <nitin.garg@freescale.com> | 2012-02-15 18:10:02 -0600 |
commit | 8db0d7aedb35773a1319bd5029beeb7f2f5e9833 (patch) | |
tree | efe295645ed2fc2c5f6a9471a30c1468c8f7d31c | |
parent | 1af7a6f27a945a38ebbd9dee7f0d733eb5242adc (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.c | 3 | ||||
-rw-r--r-- | drivers/mmc/host/sdhci.c | 36 | ||||
-rw-r--r-- | drivers/mxc/amd-gpu/platform/hal/linux/gsl_kmod_cleanup.c | 11 | ||||
-rw-r--r-- | drivers/power/max17085_battery.c | 24 | ||||
-rw-r--r-- | drivers/regulator/core.c | 2 | ||||
-rw-r--r-- | drivers/rtc/rtc-da9052.c | 4 | ||||
-rw-r--r-- | include/linux/rfkill.h | 31 | ||||
-rw-r--r-- | net/rfkill/core.c | 14 |
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 |