From 2f7c68cb55ecb7331f2381deb497c27155f32faf Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Wed, 03 Jan 2024 09:43:39 +0000 Subject: [PATCH] update kernel to 5.10.198 --- kernel/drivers/mfd/rk630.c | 83 +++++++++++++++++++++++++++++++++++++++-- 1 files changed, 79 insertions(+), 4 deletions(-) diff --git a/kernel/drivers/mfd/rk630.c b/kernel/drivers/mfd/rk630.c index 732c3c0..b8b8538 100644 --- a/kernel/drivers/mfd/rk630.c +++ b/kernel/drivers/mfd/rk630.c @@ -13,7 +13,7 @@ #include <linux/gpio/consumer.h> #include <linux/mfd/rk630.h> -static int rk630_macphy_enable(struct rk630 *rk630) +static int rk630_macphy_enable(struct rk630 *rk630, unsigned long rate) { u32 val; int ret; @@ -68,8 +68,23 @@ return ret; } - /* mode sel: RMII && clock sel: 24M && BGS value: OTP && id */ - val = (2 << 14) | (0 << 12) | (0x1 << 8) | (6 << 5) | 1; + /* mode sel: RMII && BGS value: OTP && id */ + val = (2 << 14) | (0 << 12) | (0x1 << 8) | 1; + switch (rate) { + case 24000000: + val |= 0x6 << 5; + break; + case 25000000: + val |= 0x4 << 5; + break; + case 27000000: + val |= 0x5 << 5; + break; + default: + dev_err(rk630->dev, "Unsupported clock rate: %ld\n", rate); + return -EINVAL; + } + ret = regmap_write(rk630->grf, GRF_REG(0x404), val | 0xffff0000); if (ret != 0) { dev_err(rk630->dev, "Could not write to GRF: %d\n", ret); @@ -100,6 +115,10 @@ { .name = "rk630-tve", .of_compatible = "rockchip,rk630-tve", + }, + { + .name = "rk630-rtc", + .of_compatible = "rockchip,rk630-rtc", }, { .name = "rk630-macphy", @@ -164,11 +183,57 @@ }; EXPORT_SYMBOL_GPL(rk630_cru_regmap_config); +static const struct regmap_range rk630_rtc_readable_ranges[] = { + regmap_reg_range(RTC_SET_SECONDS, RTC_CNT_3), +}; + +static const struct regmap_access_table rk630_rtc_readable_table = { + .yes_ranges = rk630_rtc_readable_ranges, + .n_yes_ranges = ARRAY_SIZE(rk630_rtc_readable_ranges), +}; + +const struct regmap_config rk630_rtc_regmap_config = { + .name = "rtc", + .reg_bits = 32, + .val_bits = 32, + .reg_stride = 4, + .max_register = RTC_MAX_REGISTER, + .reg_format_endian = REGMAP_ENDIAN_NATIVE, + .val_format_endian = REGMAP_ENDIAN_NATIVE, + .rd_table = &rk630_rtc_readable_table, +}; +EXPORT_SYMBOL_GPL(rk630_rtc_regmap_config); + int rk630_core_probe(struct rk630 *rk630) { bool macphy_enabled = false; + struct clk *ref_clk; struct device_node *np; + unsigned long rate; int ret; + + if (!rk630->irq) { + dev_err(rk630->dev, "No interrupt support, no core IRQ\n"); + return -EINVAL; + } + + ref_clk = devm_clk_get(rk630->dev, "ref"); + if (IS_ERR(ref_clk)) { + dev_err(rk630->dev, "failed to get ref clk source\n"); + return PTR_ERR(ref_clk); + } + + ret = clk_prepare_enable(ref_clk); + if (ret < 0) { + dev_err(rk630->dev, "failed to enable ref clk - %d\n", ret); + return ret; + } + rate = clk_get_rate(ref_clk); + + ret = devm_add_action_or_reset(rk630->dev, (void (*) (void *))clk_disable_unprepare, + ref_clk); + if (ret) + return ret; rk630->reset_gpio = devm_gpiod_get(rk630->dev, "reset", 0); if (IS_ERR(rk630->reset_gpio)) { @@ -182,6 +247,16 @@ gpiod_direction_output(rk630->reset_gpio, 1); usleep_range(50000, 60000); gpiod_direction_output(rk630->reset_gpio, 0); + + /** + * If rtc output clamp is enabled, rtc regs can't be accessed, + * RK630 irq add will failed. + */ + regmap_update_bits(rk630->grf, PLUMAGE_GRF_SOC_CON0, + RTC_CLAMP_EN_MASK, RTC_CLAMP_EN(1)); + + /* disable ext_off\vbat_det\msec\sys_int\periodic interrupt by default */ + regmap_write(rk630->rtc, RTC_INT1_EN, 0); ret = devm_mfd_add_devices(rk630->dev, PLATFORM_DEVID_NONE, rk630_devs, ARRAY_SIZE(rk630_devs), @@ -204,7 +279,7 @@ } if (macphy_enabled) - rk630_macphy_enable(rk630); + rk630_macphy_enable(rk630, rate); else rk630_macphy_disable(rk630); -- Gitblit v1.6.2