22237d5a58
These are various bug fixes that were not considered important enough for merging into 3.10. The majority of the ARM fixes are for the OMAP and at91 platforms, and there is another set of bug fixes for device drivers that resolve 'randconfig' build errors and that the subsystem maintainers either did not pick up or preferred to get merged through the arm-soc tree. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIVAwUAUdLnbGCrR//JCVInAQIGrhAAmxO2ydm7hRqelJ1o5R1kW0EjqgPrrFYY mWYj+ipqptiRmLgz8YpbCmEOpdcdBoWYy9V7WhDRtDZ0H2lwOVD8dhyQOjSe6seO 229EJjHv3Fj7jeZd8q/uNC6yl8hYGKIOqKNxkj2C5IR8RTpJFoWCJxtGGcG1LeAG 6VhEd4rZD7J1IGzk+VhGxdnkO5IvNk8M7RFkb1A26O1Vp/7UiZpmqQb5y5uBKYvx Uqbw1PpEjS+7vm9hxEH/Wzb3pDu8n+j8xsGj7aCsngGtNEyI/CLHFGaUS9CuY7a2 wvvrw+AMGNpskBGnHNyVtgT3ZK8SIj3InlAfudKS6oNMHgIGF0bmht/T1laNAuBw m8vc1d/mMbTfWDyEWuDwGLwQvYxgDPYCYH+Gk1mr1vxboI/6U1CbwEytkm+eMaDG 7jPPCVfiQJ3QbjSr7bUCpGyiYQaJKODX5R1bzhBSnMEId0dl8RUrYdk2/DyrfA9d 9HPmcWWi0cO15LsTL4HHlXv/9zMHYfldsAXSncM8WoLkGlWSGLbNBhsX+QEFBkXd YhNDfQh7Nu/vHJ/IqGlOp8ZD8ZJZAk8VySqUWULKiLBVKkUyX0bBncZPDbZtEVIR MhAgl00HvfIFyE1vd446qd1p52ff/pG7SO31yMy5+s+dUC7K2/dJAWLLh19Hfrqu 5Bz03uSbGG4= =gNDf -----END PGP SIGNATURE----- Merge tag 'fixes-non-critical-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc Pull ARM SoC non-cricitical bug fixes from Arnd Bergmann: "These are various bug fixes that were not considered important enough for merging into 3.10. The majority of the ARM fixes are for the OMAP and at91 platforms, and there is another set of bug fixes for device drivers that resolve 'randconfig' build errors and that the subsystem maintainers either did not pick up or preferred to get merged through the arm-soc tree." * tag 'fixes-non-critical-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (43 commits) ARM: at91/PMC: use at91_usb_rate() for UTMI PLL ARM: at91/PMC: fix at91sam9n12 USB FS init ARM: at91/PMC: at91sam9n12 family has a PLLB ARM: at91/PMC: sama5d3 family doesn't have a PLLB ARM: tegra: fix section mismatch in tegra_pmc_parse_dt ARM: mxs: don't select HAVE_PWM ARM: mxs: stub out mxs_pm_init for !CONFIG_PM cpuidle: calxeda: select ARM_CPU_SUSPEND ARM: mvebu: fix length of ethernet registers in mv78260 dtsi ARM: at91: cpuidle: Fix target_residency ARM: at91: fix at91_extern_irq usage for non-dt boards ARM: sirf: use CONFIG_SIRF rather than CONFIG_PRIMA2 where necessary clocksource: kona: adapt to CLOCKSOURCE_OF_DECLARE change X.509: do not emit any informational output mtd: omap2: allow bulding as a module [SCSI] nsp32: use mdelay instead of large udelay constants hwrng: bcm2835: fix MODULE_LICENSE tag ARM: at91: Change the internal SRAM memory type MT_MEMORY_NONCACHED ARM: at91: Fix link breakage when !CONFIG_PHYLIB MAINTAINERS: Add exynos filename match to ARM/S5P EXYNOS ARM ARCHITECTURES ...
153 lines
3.3 KiB
C
153 lines
3.3 KiB
C
/*
|
|
* power management entry for CSR SiRFprimaII
|
|
*
|
|
* Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
|
|
*
|
|
* Licensed under GPLv2 or later.
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/suspend.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/export.h>
|
|
#include <linux/of.h>
|
|
#include <linux/of_address.h>
|
|
#include <linux/of_device.h>
|
|
#include <linux/of_platform.h>
|
|
#include <linux/io.h>
|
|
#include <linux/rtc/sirfsoc_rtciobrg.h>
|
|
#include <asm/suspend.h>
|
|
#include <asm/hardware/cache-l2x0.h>
|
|
|
|
#include "pm.h"
|
|
|
|
/*
|
|
* suspend asm codes will access these to make DRAM become self-refresh and
|
|
* system sleep
|
|
*/
|
|
u32 sirfsoc_pwrc_base;
|
|
void __iomem *sirfsoc_memc_base;
|
|
|
|
static void sirfsoc_set_wakeup_source(void)
|
|
{
|
|
u32 pwr_trigger_en_reg;
|
|
pwr_trigger_en_reg = sirfsoc_rtc_iobrg_readl(sirfsoc_pwrc_base +
|
|
SIRFSOC_PWRC_TRIGGER_EN);
|
|
#define X_ON_KEY_B (1 << 0)
|
|
sirfsoc_rtc_iobrg_writel(pwr_trigger_en_reg | X_ON_KEY_B,
|
|
sirfsoc_pwrc_base + SIRFSOC_PWRC_TRIGGER_EN);
|
|
}
|
|
|
|
static void sirfsoc_set_sleep_mode(u32 mode)
|
|
{
|
|
u32 sleep_mode = sirfsoc_rtc_iobrg_readl(sirfsoc_pwrc_base +
|
|
SIRFSOC_PWRC_PDN_CTRL);
|
|
sleep_mode &= ~(SIRFSOC_SLEEP_MODE_MASK << 1);
|
|
sleep_mode |= mode << 1;
|
|
sirfsoc_rtc_iobrg_writel(sleep_mode, sirfsoc_pwrc_base +
|
|
SIRFSOC_PWRC_PDN_CTRL);
|
|
}
|
|
|
|
static int sirfsoc_pre_suspend_power_off(void)
|
|
{
|
|
u32 wakeup_entry = virt_to_phys(cpu_resume);
|
|
|
|
sirfsoc_rtc_iobrg_writel(wakeup_entry, sirfsoc_pwrc_base +
|
|
SIRFSOC_PWRC_SCRATCH_PAD1);
|
|
|
|
sirfsoc_set_wakeup_source();
|
|
|
|
sirfsoc_set_sleep_mode(SIRFSOC_DEEP_SLEEP_MODE);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int sirfsoc_pm_enter(suspend_state_t state)
|
|
{
|
|
switch (state) {
|
|
case PM_SUSPEND_MEM:
|
|
sirfsoc_pre_suspend_power_off();
|
|
|
|
outer_flush_all();
|
|
outer_disable();
|
|
/* go zzz */
|
|
cpu_suspend(0, sirfsoc_finish_suspend);
|
|
outer_resume();
|
|
break;
|
|
default:
|
|
return -EINVAL;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static const struct platform_suspend_ops sirfsoc_pm_ops = {
|
|
.enter = sirfsoc_pm_enter,
|
|
.valid = suspend_valid_only_mem,
|
|
};
|
|
|
|
int __init sirfsoc_pm_init(void)
|
|
{
|
|
suspend_set_ops(&sirfsoc_pm_ops);
|
|
return 0;
|
|
}
|
|
|
|
static const struct of_device_id pwrc_ids[] = {
|
|
{ .compatible = "sirf,prima2-pwrc" },
|
|
{}
|
|
};
|
|
|
|
static int __init sirfsoc_of_pwrc_init(void)
|
|
{
|
|
struct device_node *np;
|
|
|
|
np = of_find_matching_node(NULL, pwrc_ids);
|
|
if (!np) {
|
|
pr_err("unable to find compatible sirf pwrc node in dtb\n");
|
|
return -ENOENT;
|
|
}
|
|
|
|
/*
|
|
* pwrc behind rtciobrg is not located in memory space
|
|
* though the property is named reg. reg only means base
|
|
* offset for pwrc. then of_iomap is not suitable here.
|
|
*/
|
|
if (of_property_read_u32(np, "reg", &sirfsoc_pwrc_base))
|
|
panic("unable to find base address of pwrc node in dtb\n");
|
|
|
|
of_node_put(np);
|
|
|
|
return 0;
|
|
}
|
|
postcore_initcall(sirfsoc_of_pwrc_init);
|
|
|
|
static const struct of_device_id memc_ids[] = {
|
|
{ .compatible = "sirf,prima2-memc" },
|
|
{}
|
|
};
|
|
|
|
static int sirfsoc_memc_probe(struct platform_device *op)
|
|
{
|
|
struct device_node *np = op->dev.of_node;
|
|
|
|
sirfsoc_memc_base = of_iomap(np, 0);
|
|
if (!sirfsoc_memc_base)
|
|
panic("unable to map memc registers\n");
|
|
|
|
return 0;
|
|
}
|
|
|
|
static struct platform_driver sirfsoc_memc_driver = {
|
|
.probe = sirfsoc_memc_probe,
|
|
.driver = {
|
|
.name = "sirfsoc-memc",
|
|
.owner = THIS_MODULE,
|
|
.of_match_table = memc_ids,
|
|
},
|
|
};
|
|
|
|
static int __init sirfsoc_memc_init(void)
|
|
{
|
|
return platform_driver_register(&sirfsoc_memc_driver);
|
|
}
|
|
postcore_initcall(sirfsoc_memc_init);
|