mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
Allow parent rate changes for i2s on rk3288
and rockchip as well as s3c24xx restart handlers. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABCAAGBQJUK/GYAAoJEPOmecmc0R2Bnc8IAJY3NpUhN2It0WqL1meeIDr7 jGVphxhiEsAlXMbHyO0V/LhUTbGtjfDotd43Y84cZW43R7G2ErvvBsWMKCff2xIB cVtjXJ8JI+s2T/gBEssZDnhh1dcP04fnZ2LMdLCGudnmn2AyR2AXQQBqFiO+kQWe 0x2dsGgcQPn93X9i9sT03BKJTZjRoCZkUh0aJ2y+yL9Y5A9CNXCVGfJ5E1GNw3Px ffeKA0OsOhUMw9aqb8fLvDuRd0mo1i+BSCaOeNTlwzASmxCUJ9MOOKtF/Khx7x2r 6N3w/EN4F8R+qJ/gOyZR9I3SrnLU1rMBOHvaSxDJb0RXAq5AROvQS1t4GiF2A68= =bvGz -----END PGP SIGNATURE----- Merge tag 'v3.18-rockchip-clk2' of git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip into clk-next Allow parent rate changes for i2s on rk3288 and rockchip as well as s3c24xx restart handlers.
This commit is contained in:
commit
a797900950
14 changed files with 247 additions and 46 deletions
|
|
@ -735,6 +735,8 @@ static void __init rk3188_common_clk_init(struct device_node *np)
|
|||
|
||||
rockchip_register_softrst(np, 9, reg_base + RK2928_SOFTRST_CON(0),
|
||||
ROCKCHIP_SOFTRST_HIWORD_MASK);
|
||||
|
||||
rockchip_register_restart_notifier(RK2928_GLB_SRST_FST);
|
||||
}
|
||||
|
||||
static void __init rk3066a_clk_init(struct device_node *np)
|
||||
|
|
|
|||
|
|
@ -300,15 +300,15 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = {
|
|||
COMPOSITE(0, "i2s_src", mux_pll_src_cpll_gpll_p, 0,
|
||||
RK3288_CLKSEL_CON(4), 15, 1, MFLAGS, 0, 7, DFLAGS,
|
||||
RK3288_CLKGATE_CON(4), 1, GFLAGS),
|
||||
COMPOSITE_FRAC(0, "i2s_frac", "i2s_src", 0,
|
||||
COMPOSITE_FRAC(0, "i2s_frac", "i2s_src", CLK_SET_RATE_PARENT,
|
||||
RK3288_CLKSEL_CON(8), 0,
|
||||
RK3288_CLKGATE_CON(4), 2, GFLAGS),
|
||||
MUX(0, "i2s_pre", mux_i2s_pre_p, 0,
|
||||
MUX(0, "i2s_pre", mux_i2s_pre_p, CLK_SET_RATE_PARENT,
|
||||
RK3288_CLKSEL_CON(4), 8, 2, MFLAGS),
|
||||
COMPOSITE_NODIV(0, "i2s0_clkout", mux_i2s_clkout_p, 0,
|
||||
COMPOSITE_NODIV(0, "i2s0_clkout", mux_i2s_clkout_p, CLK_SET_RATE_PARENT,
|
||||
RK3288_CLKSEL_CON(4), 12, 1, MFLAGS,
|
||||
RK3288_CLKGATE_CON(4), 0, GFLAGS),
|
||||
GATE(SCLK_I2S0, "sclk_i2s0", "i2s_pre", 0,
|
||||
GATE(SCLK_I2S0, "sclk_i2s0", "i2s_pre", CLK_SET_RATE_PARENT,
|
||||
RK3288_CLKGATE_CON(4), 3, GFLAGS),
|
||||
|
||||
MUX(0, "spdif_src", mux_pll_src_cpll_gpll_p, 0,
|
||||
|
|
@ -808,5 +808,7 @@ static void __init rk3288_clk_init(struct device_node *np)
|
|||
|
||||
rockchip_register_softrst(np, 12, reg_base + RK3288_SOFTRST_CON(0),
|
||||
ROCKCHIP_SOFTRST_HIWORD_MASK);
|
||||
|
||||
rockchip_register_restart_notifier(RK3288_GLB_SRST_FST);
|
||||
}
|
||||
CLK_OF_DECLARE(rk3288_cru, "rockchip,rk3288-cru", rk3288_clk_init);
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@
|
|||
#include <linux/clk-provider.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/reboot.h>
|
||||
#include "clk.h"
|
||||
|
||||
/**
|
||||
|
|
@ -330,3 +331,27 @@ void __init rockchip_clk_protect_critical(const char *clocks[], int nclocks)
|
|||
clk_prepare_enable(clk);
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned int reg_restart;
|
||||
static int rockchip_restart_notify(struct notifier_block *this,
|
||||
unsigned long mode, void *cmd)
|
||||
{
|
||||
writel(0xfdb9, reg_base + reg_restart);
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
static struct notifier_block rockchip_restart_handler = {
|
||||
.notifier_call = rockchip_restart_notify,
|
||||
.priority = 128,
|
||||
};
|
||||
|
||||
void __init rockchip_register_restart_notifier(unsigned int reg)
|
||||
{
|
||||
int ret;
|
||||
|
||||
reg_restart = reg;
|
||||
ret = register_restart_handler(&rockchip_restart_handler);
|
||||
if (ret)
|
||||
pr_err("%s: cannot register restart handler, %d\n",
|
||||
__func__, ret);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -367,6 +367,7 @@ void rockchip_clk_register_armclk(unsigned int lookup_id, const char *name,
|
|||
const struct rockchip_cpuclk_rate_table *rates,
|
||||
int nrates);
|
||||
void rockchip_clk_protect_critical(const char *clocks[], int nclocks);
|
||||
void rockchip_register_restart_notifier(unsigned int reg);
|
||||
|
||||
#define ROCKCHIP_SOFTRST_HIWORD_MASK BIT(0)
|
||||
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/reboot.h>
|
||||
|
||||
#include <dt-bindings/clock/s3c2412.h>
|
||||
|
||||
|
|
@ -26,6 +27,7 @@
|
|||
#define CLKCON 0x0c
|
||||
#define CLKDIVN 0x14
|
||||
#define CLKSRC 0x1c
|
||||
#define SWRST 0x30
|
||||
|
||||
/* list of PLLs to be registered */
|
||||
enum s3c2412_plls {
|
||||
|
|
@ -204,6 +206,28 @@ struct samsung_clock_alias s3c2412_aliases[] __initdata = {
|
|||
ALIAS(MSYSCLK, NULL, "fclk"),
|
||||
};
|
||||
|
||||
static int s3c2412_restart(struct notifier_block *this,
|
||||
unsigned long mode, void *cmd)
|
||||
{
|
||||
/* errata "Watch-dog/Software Reset Problem" specifies that
|
||||
* this reset must be done with the SYSCLK sourced from
|
||||
* EXTCLK instead of FOUT to avoid a glitch in the reset
|
||||
* mechanism.
|
||||
*
|
||||
* See the watchdog section of the S3C2412 manual for more
|
||||
* information on this fix.
|
||||
*/
|
||||
|
||||
__raw_writel(0x00, reg_base + CLKSRC);
|
||||
__raw_writel(0x533C2412, reg_base + SWRST);
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
static struct notifier_block s3c2412_restart_handler = {
|
||||
.notifier_call = s3c2412_restart,
|
||||
.priority = 129,
|
||||
};
|
||||
|
||||
/*
|
||||
* fixed rate clocks generated outside the soc
|
||||
* Only necessary until the devicetree-move is complete
|
||||
|
|
@ -233,6 +257,7 @@ void __init s3c2412_common_clk_init(struct device_node *np, unsigned long xti_f,
|
|||
unsigned long ext_f, void __iomem *base)
|
||||
{
|
||||
struct samsung_clk_provider *ctx;
|
||||
int ret;
|
||||
reg_base = base;
|
||||
|
||||
if (np) {
|
||||
|
|
@ -267,6 +292,10 @@ void __init s3c2412_common_clk_init(struct device_node *np, unsigned long xti_f,
|
|||
s3c2412_clk_sleep_init();
|
||||
|
||||
samsung_clk_of_add_provider(np, ctx);
|
||||
|
||||
ret = register_restart_handler(&s3c2412_restart_handler);
|
||||
if (ret)
|
||||
pr_warn("cannot register restart handler, %d\n", ret);
|
||||
}
|
||||
|
||||
static void __init s3c2412_clk_init(struct device_node *np)
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/reboot.h>
|
||||
|
||||
#include <dt-bindings/clock/s3c2443.h>
|
||||
|
||||
|
|
@ -33,6 +34,7 @@
|
|||
#define HCLKCON 0x30
|
||||
#define PCLKCON 0x34
|
||||
#define SCLKCON 0x38
|
||||
#define SWRST 0x44
|
||||
|
||||
/* the soc types */
|
||||
enum supported_socs {
|
||||
|
|
@ -354,6 +356,18 @@ struct samsung_clock_alias s3c2450_aliases[] __initdata = {
|
|||
ALIAS(PCLK_I2C1, "s3c2410-i2c.1", "i2c"),
|
||||
};
|
||||
|
||||
static int s3c2443_restart(struct notifier_block *this,
|
||||
unsigned long mode, void *cmd)
|
||||
{
|
||||
__raw_writel(0x533c2443, reg_base + SWRST);
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
static struct notifier_block s3c2443_restart_handler = {
|
||||
.notifier_call = s3c2443_restart,
|
||||
.priority = 129,
|
||||
};
|
||||
|
||||
/*
|
||||
* fixed rate clocks generated outside the soc
|
||||
* Only necessary until the devicetree-move is complete
|
||||
|
|
@ -378,6 +392,7 @@ void __init s3c2443_common_clk_init(struct device_node *np, unsigned long xti_f,
|
|||
void __iomem *base)
|
||||
{
|
||||
struct samsung_clk_provider *ctx;
|
||||
int ret;
|
||||
reg_base = base;
|
||||
|
||||
if (np) {
|
||||
|
|
@ -447,6 +462,10 @@ void __init s3c2443_common_clk_init(struct device_node *np, unsigned long xti_f,
|
|||
s3c2443_clk_sleep_init();
|
||||
|
||||
samsung_clk_of_add_provider(np, ctx);
|
||||
|
||||
ret = register_restart_handler(&s3c2443_restart_handler);
|
||||
if (ret)
|
||||
pr_warn("cannot register restart handler, %d\n", ret);
|
||||
}
|
||||
|
||||
static void __init s3c2416_clk_init(struct device_node *np)
|
||||
|
|
|
|||
Loading…
Reference in a new issue