clk: aspeed: revise ast2600 i3c clock and reset

revise the i3c clock and reset control.

Signed-off-by: Dylan Hung <dylan_hung@aspeedtech.com>
Change-Id: I81d00ce3c5c6c22d208ad34855def9df9c0b407d
This commit is contained in:
Dylan Hung 2021-10-19 16:36:30 +08:00 committed by Ryan Chen
parent a79a8efe70
commit ed44b8cdfd
4 changed files with 71 additions and 17 deletions

View file

@ -177,6 +177,32 @@ config ASPEED_BT_IPMI_BMC
found on Aspeed SOCs (AST2400 and AST2500). The driver
implements the BMC side of the BT interface.
config SSIF_IPMI_BMC
tristate "SSIF IPMI BMC driver"
select I2C
select I2C_SLAVE
help
This enables the IPMI SMBus system interface (SSIF) at the
management (BMC) side.
The driver implements the BMC side of the SMBus system
interface (SSIF).
config ASPEED_SSIF_IPMI_BMC
depends on ARCH_ASPEED || COMPILE_TEST
select SSIF_IPMI_BMC
tristate "Aspeed SSIF IPMI BMC driver"
help
Provides a driver for the SSIF IPMI interface found on
Aspeed AST2500 SoC.
The driver implements the BMC side of the SMBus system
interface (SSIF), specific for Aspeed AST2500 SoC.
The driver implements the BMC side of
the IPMI over SSIF interface.
config IPMB_DEVICE_INTERFACE
tristate 'IPMB Interface handler'
depends on I2C

View file

@ -30,3 +30,5 @@ obj-$(CONFIG_ASPEED_BT_IPMI_BMC) += bt-bmc.o
obj-$(CONFIG_ASPEED_KCS_IPMI_BMC) += kcs_bmc_aspeed.o
obj-$(CONFIG_NPCM7XX_KCS_IPMI_BMC) += kcs_bmc_npcm7xx.o
obj-$(CONFIG_IPMB_DEVICE_INTERFACE) += ipmb_dev_int.o
obj-$(CONFIG_SSIF_IPMI_BMC) += ssif_bmc.o
obj-$(CONFIG_ASPEED_SSIF_IPMI_BMC) += ssif_bmc_aspeed.o

View file

@ -4,6 +4,7 @@
#define pr_fmt(fmt) "clk-ast2600: " fmt
#include <linux/bitfield.h>
#include <linux/mfd/syscon.h>
#include <linux/of_address.h>
#include <linux/of_device.h>
@ -33,6 +34,17 @@
#define ASPEED_G6_CLK_SELECTION2 0x304
#define ASPEED_G6_CLK_SELECTION4 0x310
#define ASPEED_G6_CLK_SELECTION5 0x314
#define I3C_CLK_SELECTION BIT(31)
#define I3C_CLK_SELECT_HCLK 0
#define I3C_CLK_SELECT_APLL_DIV 1
#define APLL_DIV_SELECTION GENMASK(30, 28)
#define APLL_DIV_2 0b001
#define APLL_DIV_3 0b010
#define APLL_DIV_4 0b011
#define APLL_DIV_5 0b100
#define APLL_DIV_6 0b101
#define APLL_DIV_7 0b110
#define APLL_DIV_8 0b111
#define ASPEED_HPLL_PARAM 0x200
#define ASPEED_APLL_PARAM 0x210
@ -151,14 +163,14 @@ static struct aspeed_gate_data aspeed_g6_gates[] = {
[ASPEED_CLK_GATE_LHCCLK] = { 37, -1, "lhclk-gate", "lhclk", 0 }, /* LPC master/LPC+ */
/* Reserved 38 RSA: no longer used */
/* Reserved 39 */
[ASPEED_CLK_GATE_I3C0CLK] = { 40, 40, "i3c0clk-gate", NULL, 0 }, /* I3C0 */
[ASPEED_CLK_GATE_I3C1CLK] = { 41, 41, "i3c1clk-gate", NULL, 0 }, /* I3C1 */
[ASPEED_CLK_GATE_I3C2CLK] = { 42, 42, "i3c2clk-gate", NULL, 0 }, /* I3C2 */
[ASPEED_CLK_GATE_I3C3CLK] = { 43, 43, "i3c3clk-gate", NULL, 0 }, /* I3C3 */
[ASPEED_CLK_GATE_I3C4CLK] = { 44, 44, "i3c4clk-gate", NULL, 0 }, /* I3C4 */
[ASPEED_CLK_GATE_I3C5CLK] = { 45, 45, "i3c5clk-gate", NULL, 0 }, /* I3C5 */
[ASPEED_CLK_GATE_I3C6CLK] = { 46, 46, "i3c6clk-gate", NULL, 0 }, /* I3C6 */
[ASPEED_CLK_GATE_I3C7CLK] = { 47, 47, "i3c7clk-gate", NULL, 0 }, /* I3C7 */
[ASPEED_CLK_GATE_I3CDMACLK] = { 39, ASPEED_RESET_I3C, "i3cclk-gate", NULL, 0 }, /* I3C_DMA */
[ASPEED_CLK_GATE_I3C0CLK] = { 40, ASPEED_RESET_I3C0, "i3c0clk-gate", "i3cclk", 0 },
[ASPEED_CLK_GATE_I3C1CLK] = { 41, ASPEED_RESET_I3C1, "i3c1clk-gate", "i3cclk", 0 },
[ASPEED_CLK_GATE_I3C2CLK] = { 42, ASPEED_RESET_I3C2, "i3c2clk-gate", "i3cclk", 0 },
[ASPEED_CLK_GATE_I3C3CLK] = { 43, ASPEED_RESET_I3C3, "i3c3clk-gate", "i3cclk", 0 },
[ASPEED_CLK_GATE_I3C4CLK] = { 44, ASPEED_RESET_I3C4, "i3c4clk-gate", "i3cclk", 0 },
[ASPEED_CLK_GATE_I3C5CLK] = { 45, ASPEED_RESET_I3C5, "i3c5clk-gate", "i3cclk", 0 },
[ASPEED_CLK_GATE_RESERVED44] = { 46, ASPEED_RESET_RESERVED46, "reserved-46", NULL, 0 },
[ASPEED_CLK_GATE_UART1CLK] = { 48, -1, "uart1clk-gate", "uxclk", CLK_IS_CRITICAL }, /* UART1 */
[ASPEED_CLK_GATE_UART2CLK] = { 49, -1, "uart2clk-gate", "uxclk", CLK_IS_CRITICAL }, /* UART2 */
[ASPEED_CLK_GATE_UART3CLK] = { 50, -1, "uart3clk-gate", "uxclk", 0 }, /* UART3 */
@ -964,6 +976,21 @@ static void __init aspeed_g6_cc(struct regmap *map)
hw = clk_hw_register_fixed_factor(NULL, "huxclk", "uartx", 0, mult, div);
aspeed_g6_clk_data->hws[ASPEED_CLK_HUXCLK] = hw;
/* i3c clock */
regmap_read(map, ASPEED_G6_CLK_SELECTION5, &val);
if (FIELD_GET(I3C_CLK_SELECTION, val) == I3C_CLK_SELECT_APLL_DIV) {
val = FIELD_GET(APLL_DIV_SELECTION, val);
if (val)
div = val + 1;
else
div = val + 2;
hw = clk_hw_register_fixed_factor(NULL, "i3cclk", "apll", 0, 1,
div);
} else {
hw = clk_hw_register_fixed_factor(NULL, "i3cclk", "ahb", 0, 1,
1);
}
aspeed_g6_clk_data->hws[ASPEED_CLK_I3C] = hw;
};
static void __init aspeed_g6_cc_init(struct device_node *np)

View file

@ -51,15 +51,14 @@
#define ASPEED_CLK_GATE_SDCLK 35
#define ASPEED_CLK_GATE_EMMCCLK 36
#define ASPEED_CLK_GATE_I3C0CLK 37
#define ASPEED_CLK_GATE_I3C1CLK 38
#define ASPEED_CLK_GATE_I3C2CLK 39
#define ASPEED_CLK_GATE_I3C3CLK 40
#define ASPEED_CLK_GATE_I3C4CLK 41
#define ASPEED_CLK_GATE_I3C5CLK 42
#define ASPEED_CLK_GATE_I3C6CLK 43
#define ASPEED_CLK_GATE_I3C7CLK 44
#define ASPEED_CLK_GATE_I3CDMACLK 37
#define ASPEED_CLK_GATE_I3C0CLK 38
#define ASPEED_CLK_GATE_I3C1CLK 39
#define ASPEED_CLK_GATE_I3C2CLK 40
#define ASPEED_CLK_GATE_I3C3CLK 41
#define ASPEED_CLK_GATE_I3C4CLK 42
#define ASPEED_CLK_GATE_I3C5CLK 43
#define ASPEED_CLK_GATE_RESERVED44 44
#define ASPEED_CLK_GATE_FSICLK 45
#define ASPEED_CLK_HPLL 46