diff options
Diffstat (limited to 'meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed')
46 files changed, 2595 insertions, 936 deletions
diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0001-arm-dts-add-DTS-for-Intel-platforms.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0001-arm-dts-add-DTS-for-Intel-platforms.patch new file mode 100644 index 000000000..d185171f6 --- /dev/null +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0001-arm-dts-add-DTS-for-Intel-platforms.patch @@ -0,0 +1,473 @@ +From 965806acbf8eb3f38367958594f0651e1893ddb8 Mon Sep 17 00:00:00 2001 +From: Yuan Li <yuan.li@linux.intel.com> +Date: Tue, 19 Sep 2017 15:55:39 +0800 +Subject: [PATCH] arm: dts: add DTS for Intel platforms + +Add the DTS file for Intel systems. + +Signed-off-by: Yuan Li <yuan.li@linux.intel.com> +Signed-off-by: Yong Li <yong.b.li@linux.intel.com> +Signed-off-by: James Feist <james.feist@linux.intel.com> +Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> +Signed-off-by: Jason M. Bills <jason.m.bills@linux.intel.com> +Signed-off-by: Zhu, Yunge <yunge.zhu@linux.intel.com> +Signed-off-by: Qiang XU <qiang.xu@linux.intel.com> +Signed-off-by: Chen Yugang <yugang.chen@linux.intel.com> +--- + arch/arm/boot/dts/aspeed-bmc-intel-purley.dts | 444 ++++++++++++++++++++++++++ + 1 file changed, 444 insertions(+) + create mode 100644 arch/arm/boot/dts/aspeed-bmc-intel-purley.dts + +diff --git a/arch/arm/boot/dts/aspeed-bmc-intel-purley.dts b/arch/arm/boot/dts/aspeed-bmc-intel-purley.dts +new file mode 100644 +index 0000000..b901d98 +--- /dev/null ++++ b/arch/arm/boot/dts/aspeed-bmc-intel-purley.dts +@@ -0,0 +1,444 @@ ++/dts-v1/; ++ ++#include "aspeed-g5.dtsi" ++#include <dt-bindings/gpio/aspeed-gpio.h> ++#include <dt-bindings/i2c/i2c.h> ++ ++/ { ++ model = "Purley BMC"; ++ compatible = "intel,purley-bmc", "aspeed,ast2500"; ++ ++ aliases { ++ serial4 = &uart5; ++ }; ++ ++ chosen { ++ stdout-path = &uart5; ++ bootargs = "console=ttyS4,115200 earlyprintk"; ++ }; ++ ++ memory@80000000 { ++ reg = <0x80000000 0x20000000>; ++ }; ++ ++ reserved-memory { ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ranges; ++ ++ vga_memory: framebuffer@7f000000 { ++ no-map; ++ reg = <0x7f000000 0x01000000>; ++ }; ++ ++ gfx_memory: framebuffer { ++ size = <0x01000000>; ++ alignment = <0x01000000>; ++ compatible = "shared-dma-pool"; ++ reusable; ++ }; ++ ++ video_engine_memory: jpegbuffer { ++ size = <0x02000000>; /* 32M */ ++ alignment = <0x01000000>; ++ compatible = "shared-dma-pool"; ++ reusable; ++ }; ++ ++ ramoops@9eff0000{ ++ compatible = "ramoops"; ++ reg = <0x9eff0000 0x10000>; ++ record-size = <0x2000>; ++ console-size = <0x2000>; ++ }; ++ }; ++ ++ vga-shared-memory { ++ compatible = "aspeed,ast2500-vga-sharedmem"; ++ reg = <0x9ff00000 0x100000>; ++ }; ++ ++ iio-hwmon { ++ compatible = "iio-hwmon"; ++ io-channels = <&adc 0>, <&adc 1>, <&adc 2>, <&adc 3>, ++ <&adc 4>, <&adc 5>, <&adc 6>, <&adc 7>, ++ <&adc 8>, <&adc 9>, <&adc 10>, <&adc 11>, ++ <&adc 12>, <&adc 13>, <&adc 14>, <&adc 15>; ++ }; ++ ++ leds { ++ compatible = "gpio-leds"; ++ ++ identify { ++ default-state = "off"; ++ gpios = <&gpio ASPEED_GPIO(S, 6) GPIO_ACTIVE_LOW>; ++ }; ++ ++ status_amber { ++ default-state = "off"; ++ gpios = <&gpio ASPEED_GPIO(S, 5) GPIO_ACTIVE_LOW>; ++ }; ++ ++ status_green { ++ default-state = "keep"; ++ gpios = <&gpio ASPEED_GPIO(S, 4) GPIO_ACTIVE_LOW>; ++ }; ++ }; ++ ++ beeper { ++ compatible = "pwm-beeper"; ++ pwms = <&timer 5 1000000 0>; ++ }; ++}; ++ ++&fmc { ++ status = "okay"; ++ flash@0 { ++ status = "okay"; ++ m25p,fast-read; ++#include "openbmc-flash-layout-intel-64MB.dtsi" ++ }; ++}; ++ ++&espi { ++ status = "okay"; ++}; ++ ++&jtag { ++ status = "okay"; ++}; ++ ++&peci0 { ++ status = "okay"; ++ gpios = <&gpio ASPEED_GPIO(F, 6) 0>; ++}; ++ ++&syscon { ++ uart-clock-high-speed; ++ status = "okay"; ++}; ++ ++&adc { ++ status = "okay"; ++}; ++ ++&gpio { ++ status = "okay"; ++ gpio-line-names = ++ /*A0-A7*/ "","","","","","","","", ++ /*B0-B7*/ "FM_BMC_BOARD_SKU_ID0_N","FM_BMC_BOARD_SKU_ID1_N","FM_BMC_BOARD_SKU_ID2_N","FM_BMC_BOARD_SKU_ID3_N","FM_BMC_BOARD_SKU_ID4_N","","","", ++ /*C0-C7*/ "","","","","","","","", ++ /*D0-D7*/ "","","","","","","","", ++ /*E0-E7*/ "RESET_BUTTON","RESET_OUT","POWER_BUTTON","POWER_OUT","","DEBUG_EN_N","","", ++ /*F0-F7*/ "NMI_OUT","","","","CPU_ERR0","CPU_ERR1","PLTRST_N","PRDY_N", ++ /*G0-G7*/ "CPU_ERR2","CPU_CATERR","PCH_BMC_THERMTRIP","","","FM_BMC_BOARD_SKU_ID5_N","","", ++ /*H0-H7*/ "","","","","","","","", ++ /*I0-I7*/ "","","","","","","","", ++ /*J0-J7*/ "","","","","","","","", ++ /*K0-K7*/ "","","","","","","","", ++ /*L0-L7*/ "","","","","","","","", ++ /*M0-M7*/ "","","","","","","","", ++ /*N0-N7*/ "","","","","","","","", ++ /*O0-O7*/ "","","","","","","","", ++ /*P0-P7*/ "","","","","","","","", ++ /*Q0-Q7*/ "","","","","","","","PWR_DEBUG_N", ++ /*R0-R7*/ "","XDP_PRST_N","","","","","","", ++ /*S0-S7*/ "","SYSPWROK","RSMRST_N","","","","","", ++ /*T0-T7*/ "","","","","","","","", ++ /*U0-U7*/ "","","","","","","","", ++ /*V0-V7*/ "","","","","","","","", ++ /*W0-W7*/ "","","","","","","","", ++ /*X0-X7*/ "","","","","","","","", ++ /*Y0-Y7*/ "SIO_S3","SIO_S5","","SIO_ONCONTROL","","","","", ++ /*Z0-Z7*/ "","SIO_POWER_GOOD","","","","","","", ++ /*AA0-AA7*/ "P3VBAT_BRIDGE_EN","","","","PREQ_N","TCK_MUX_SEL","SMI","POST_COMPLETE", ++ /*AB0-AB7*/ "","NMI_BUTTON","ID_BUTTON","PS_PWROK","","","","", ++ /*AC0-AC7*/ "","","","","","","",""; ++}; ++ ++&sgpio { ++ status = "okay"; ++ gpio-line-names = ++ /* SGPIO output lines */ ++ /*OA0-OA7*/ "","","","","","","","", ++ /*OB0-OB7*/ "LED_CPU1_CH1_DIMM1_FAULT","LED_CPU1_CH1_DIMM2_FAULT","LED_CPU1_CH2_DIMM1_FAULT","LED_CPU1_CH2_DIMM2_FAULT","LED_CPU1_CH3_DIMM1_FAULT","LED_CPU1_CH3_DIMM2_FAULT","LED_CPU1_CH4_DIMM1_FAULT","LED_CPU1_CH4_DIMM2_FAULT", ++ /*OC0-OC7*/ "LED_CPU1_CH5_DIMM1_FAULT","LED_CPU1_CH5_DIMM2_FAULT","LED_CPU1_CH6_DIMM1_FAULT","LED_CPU1_CH6_DIMM2_FAULT","LED_FAN1_FAULT","LED_FAN2_FAULT","LED_FAN3_FAULT","LED_FAN4_FAULT", ++ /*OD0-OD7*/ "LED_FAN5_FAULT","LED_FAN6_FAULT","LED_FAN7_FAULT","LED_FAN8_FAULT","LED_CPU2_CH1_DIMM1_FAULT","LED_CPU1_CH1_DIMM2_FAULT","LED_CPU2_CH2_DIMM1_FAULT","LED_CPU2_CH2_DIMM2_FAULT", ++ /*OE0-OE7*/ "LED_CPU2_CH3_DIMM1_FAULT","LED_CPU2_CH3_DIMM2_FAULT","LED_CPU2_CH4_DIMM1_FAULT","LED_CPU2_CH4_DIMM2_FAULT","LED_CPU2_CH5_DIMM1_FAULT","LED_CPU2_CH5_DIMM2_FAULT","LED_CPU2_CH6_DIMM1_FAULT","LED_CPU2_CH6_DIMM2_FAULT", ++ /*OF0-OF7*/ "LED_CPU3_CH1_DIMM1_FAULT","LED_CPU3_CH1_DIMM2_FAULT","LED_CPU3_CH2_DIMM1_FAULT","LED_CPU3_CH2_DIMM2_FAULT","LED_CPU3_CH3_DIMM1_FAULT","LED_CPU3_CH3_DIMM2_FAULT","LED_CPU3_CH4_DIMM1_FAULT","LED_CPU3_CH4_DIMM2_FAULT", ++ /*OG0-OG7*/ "LED_CPU3_CH5_DIMM1_FAULT","LED_CPU3_CH5_DIMM2_FAULT","LED_CPU3_CH6_DIMM1_FAULT","LED_CPU3_CH6_DIMM2_FAULT","LED_CPU4_CH1_DIMM1_FAULT","LED_CPU4_CH1_DIMM2_FAULT","LED_CPU4_CH2_DIMM1_FAULT","LED_CPU4_CH2_DIMM2_FAULT", ++ /*OH0-OH7*/ "LED_CPU4_CH3_DIMM1_FAULT","LED_CPU4_CH3_DIMM2_FAULT","LED_CPU4_CH4_DIMM1_FAULT","LED_CPU4_CH4_DIMM2_FAULT","LED_CPU4_CH5_DIMM1_FAULT","LED_CPU4_CH5_DIMM2_FAULT","LED_CPU4_CH6_DIMM1_FAULT","LED_CPU4_CH6_DIMM2_FAULT", ++ /*OI0-OI7*/ "","","","","","","","", ++ /*OJ0-OJ7*/ "","","","","","","","", ++ /*DUMMY*/ "","","","","","","","", ++ /*DUMMY*/ "","","","","","","","", ++ ++ /* SGPIO input lines */ ++ /*IA0-IA7*/ "CPU1_PRESENCE","CPU1_THERMTRIP","CPU1_VRHOT","CPU1_FIVR_FAULT","CPU1_MEM_ABCD_VRHOT","CPU1_MEM_EFGH_VRHOT","","", ++ /*IB0-IB7*/ "","","CPU2_PRESENCE","CPU2_THERMTRIP","CPU2_VRHOT","CPU2_FIVR_FAULT","CPU2_MEM_ABCD_VRHOT","CPU2_MEM_EFGH_VRHOT", ++ /*IC0-IC7*/ "","","","","","","","", ++ /*ID0-ID7*/ "","","","","","","","", ++ /*IE0-IE7*/ "","","","","","","","", ++ /*IF0-IF7*/ "","","","","","","","", ++ /*IG0-IG7*/ "","","","","","","","", ++ /*IH0-IH7*/ "","","","","","","","", ++ /*II0-II7*/ "","","","","","","","", ++ /*IJ0-IJ7*/ "","","","","","","",""; ++}; ++ ++&kcs3 { ++ kcs_addr = <0xCA2>; ++ status = "okay"; ++}; ++ ++&kcs4 { ++ kcs_addr = <0xCA4>; ++ status = "okay"; ++}; ++ ++&lpc_sio { ++ status = "okay"; ++}; ++ ++&lpc_snoop { ++ snoop-ports = <0x80>; ++ status = "okay"; ++}; ++ ++&mbox { ++ status = "okay"; ++}; ++ ++/** ++ * SAFS through SPI1 is available only on Wilson Point. ++ * These pins are used as fan presence checking gpios in WFP ++ * so commenting it out for now. ++ * &spi1 { ++ * status = "okay"; ++ * ++ * flash@0 { ++ * m25p,fast-read; ++ * status = "okay"; ++ * }; ++ *}; ++ */ ++ ++&uart1 { ++ status = "okay"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_txd1_default ++ &pinctrl_rxd1_default ++ &pinctrl_nrts1_default ++ &pinctrl_ndtr1_default ++ &pinctrl_ndsr1_default ++ &pinctrl_ncts1_default ++ &pinctrl_ndcd1_default ++ &pinctrl_nri1_default>; ++}; ++ ++&uart2 { ++ status = "okay"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_txd2_default ++ &pinctrl_rxd2_default ++ &pinctrl_nrts2_default ++ &pinctrl_ndtr2_default ++ &pinctrl_ndsr2_default ++ &pinctrl_ncts2_default ++ &pinctrl_ndcd2_default ++ &pinctrl_nri2_default>; ++}; ++ ++&uart3 { ++ status = "okay"; ++}; ++ ++&uart4 { ++ status = "okay"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <>; ++}; ++ ++&uart5 { ++ status = "okay"; ++}; ++ ++&mac1 { ++ status = "okay"; ++ ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_rgmii2_default &pinctrl_mdio2_default>; ++}; ++ ++&mac0 { ++ status = "okay"; ++ use-ncsi; ++ ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_rmii1_default>; ++}; ++ ++&i2c0 { ++ multi-master; ++ general-call; ++ aspeed,dma-buf-size = <4095>; ++ aspeed,hw-timeout-ms = <300>; ++ status = "okay"; ++}; ++ ++&i2c1 { ++ multi-master; ++ aspeed,dma-buf-size = <4095>; ++ aspeed,hw-timeout-ms = <300>; ++ status = "okay"; ++}; ++ ++&i2c2 { ++ multi-master; ++ aspeed,dma-buf-size = <4095>; ++ aspeed,hw-timeout-ms = <300>; ++ status = "okay"; ++}; ++ ++&i2c3 { ++ multi-master; ++ aspeed,dma-buf-size = <4095>; ++ aspeed,hw-timeout-ms = <300>; ++ status = "okay"; ++}; ++ ++&i2c4 { ++ multi-master; ++ aspeed,dma-buf-size = <4095>; ++ aspeed,hw-timeout-ms = <300>; ++ status = "okay"; ++ ++ hsbp0@10 { ++ compatible = "slave-mqueue"; ++ reg = <(0x10 | I2C_OWN_SLAVE_ADDRESS)>; ++ }; ++}; ++ ++&i2c5 { ++ bus-frequency = <1000000>; ++ multi-master; ++ aspeed,dma-buf-size = <4095>; ++ aspeed,hw-timeout-ms = <300>; ++ status = "okay"; ++ ++ smlink0@10 { ++ compatible = "slave-mqueue"; ++ reg = <(0x10 | I2C_OWN_SLAVE_ADDRESS)>; ++ }; ++}; ++ ++&i2c6 { ++ multi-master; ++ aspeed,dma-buf-size = <4095>; ++ aspeed,hw-timeout-ms = <300>; ++ status = "okay"; ++}; ++ ++&i2c7 { ++ multi-master; ++ #retries = <3>; ++ aspeed,dma-buf-size = <4095>; ++ aspeed,hw-timeout-ms = <300>; ++ status = "okay"; ++}; ++ ++&i2c9 { ++ multi-master; ++ aspeed,dma-buf-size = <4095>; ++ aspeed,hw-timeout-ms = <300>; ++ status = "okay"; ++}; ++ ++&i2c11 { ++ multi-master; ++ aspeed,dma-buf-size = <4095>; ++ aspeed,hw-timeout-ms = <300>; ++ status = "okay"; ++}; ++ ++&i2c13 { ++ multi-master; ++ aspeed,dma-buf-size = <4095>; ++ aspeed,hw-timeout-ms = <300>; ++ status = "okay"; ++}; ++ ++&gfx { ++ status = "okay"; ++ memory-region = <&gfx_memory>; ++}; ++ ++&vuart { ++ status = "okay"; ++}; ++ ++&pwm_tacho { ++ status = "okay"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_pwm0_default &pinctrl_pwm1_default ++ &pinctrl_pwm2_default &pinctrl_pwm3_default ++ &pinctrl_pwm4_default &pinctrl_pwm5_default ++ &pinctrl_pwm6_default &pinctrl_pwm7_default>; ++ ++ fan@0 { ++ reg = <0x00>; ++ aspeed,fan-tach-ch = /bits/ 8 <0x00 0x01>; ++ }; ++ fan@1 { ++ reg = <0x01>; ++ aspeed,fan-tach-ch = /bits/ 8 <0x02 0x03>; ++ }; ++ fan@2 { ++ reg = <0x02>; ++ aspeed,fan-tach-ch = /bits/ 8 <0x04 0x05>; ++ }; ++ fan@3 { ++ reg = <0x03>; ++ aspeed,fan-tach-ch = /bits/ 8 <0x06 0x07>; ++ }; ++ fan@4 { ++ reg = <0x04>; ++ aspeed,fan-tach-ch = /bits/ 8 <0x08 0x09>; ++ }; ++ fan@5 { ++ reg = <0x05>; ++ aspeed,fan-tach-ch = /bits/ 8 <0x0A 0x0B>; ++ }; ++ fan@6 { ++ reg = <0x06>; ++ aspeed,fan-tach-ch = /bits/ 8 <0x0C 0x0D>; ++ }; ++ fan@7 { ++ reg = <0x07>; ++ aspeed,fan-tach-ch = /bits/ 8 <0x0E 0x0F>; ++ }; ++ ++}; ++ ++&timer { ++/* ++ * Available settings: ++ * fttmr010,pwm-outputs = <5>, <6>, <7>, <8>; ++ * pinctrl-0 = <&pinctrl_timer5_default &pinctrl_timer6_default ++ * &pinctrl_timer7_default &pinctrl_timer8_default>; ++ */ ++ fttmr010,pwm-outputs = <5>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_timer5_default>; ++ #pwm-cells = <3>; ++ status = "okay"; ++}; ++ ++&video { ++ status = "okay"; ++ memory-region = <&video_engine_memory>; ++}; ++ ++&vhub { ++ status = "okay"; ++}; +-- +2.7.4 + diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0002-Enable-pass-through-on-GPIOE1-and-GPIOE3-free.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0002-Enable-pass-through-on-GPIOE1-and-GPIOE3-free.patch new file mode 100644 index 000000000..ecee21f1c --- /dev/null +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0002-Enable-pass-through-on-GPIOE1-and-GPIOE3-free.patch @@ -0,0 +1,121 @@ +From ae2bcda6000d7ec278ea78d1eda6e8aacbe5a741 Mon Sep 17 00:00:00 2001 +From: "Jason M. Bills" <jason.m.bills@linux.intel.com> +Date: Fri, 3 May 2019 16:12:39 -0700 +Subject: [PATCH] Enable pass-through on GPIOE1 and GPIOE3 free + +This change adds a gpio_disable_free() implementation that checks +if the GPIO being freed is GPIOE1 (33) or GPIOE3 (35) and will +re-enable the pass-through mux. + +Tested: +Requested GPIOs 33 and 35 and used devmem to check that pass-through +was disabled. Then freed them and checked that pass-through was +enabled again. + +Signed-off-by: Jason M. Bills <jason.m.bills@linux.intel.com> +--- + drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c | 1 + + drivers/pinctrl/aspeed/pinctrl-aspeed.c | 60 ++++++++++++++++++++++++++++++ + drivers/pinctrl/aspeed/pinctrl-aspeed.h | 3 ++ + 3 files changed, 64 insertions(+) + +diff --git a/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c b/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c +index d8a804b9f958..5e7f53fab76e 100644 +--- a/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c ++++ b/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c +@@ -2805,6 +2805,7 @@ static const struct pinmux_ops aspeed_g5_pinmux_ops = { + .get_function_groups = aspeed_pinmux_get_fn_groups, + .set_mux = aspeed_pinmux_set_mux, + .gpio_request_enable = aspeed_gpio_request_enable, ++ .gpio_disable_free = aspeed_gpio_disable_free, + .strict = true, + }; + +diff --git a/drivers/pinctrl/aspeed/pinctrl-aspeed.c b/drivers/pinctrl/aspeed/pinctrl-aspeed.c +index 54933665b5f8..aa7d56e99824 100644 +--- a/drivers/pinctrl/aspeed/pinctrl-aspeed.c ++++ b/drivers/pinctrl/aspeed/pinctrl-aspeed.c +@@ -356,6 +356,66 @@ int aspeed_gpio_request_enable(struct pinctrl_dev *pctldev, + return aspeed_sig_expr_enable(&pdata->pinmux, expr); + } + ++void aspeed_gpio_disable_free(struct pinctrl_dev *pctldev, ++ struct pinctrl_gpio_range *range, ++ unsigned int offset) ++{ ++ const struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); ++ const struct aspeed_pin_desc *pdesc = pdata->pins[offset].drv_data; ++ const struct aspeed_sig_expr ***prios, **funcs, *expr; ++ int ret; ++ ++ /* ++ * If we're freeing GPIOE1 (33) or GPIOE3 (35) then re-enable the ++ * pass-through mux setting; otherwise, do nothing. ++ */ ++ if (offset != 33 && offset != 35) ++ return; ++ ++ dev_dbg(pctldev->dev, ++ "Freeing pass-through pin %s (%d). Re-enabling pass-through.\n", ++ pdesc->name, offset); ++ ++ if (!pdesc) ++ return; ++ ++ prios = pdesc->prios; ++ ++ if (!prios) ++ return; ++ ++ /* Disable any functions of higher priority than GPIO just in case */ ++ while ((funcs = *prios)) { ++ if (aspeed_gpio_in_exprs(funcs)) ++ break; ++ ++ ret = aspeed_disable_sig(&pdata->pinmux, funcs); ++ if (ret) ++ return; ++ ++ prios++; ++ } ++ ++ if (!funcs) { ++ char *signals = get_defined_signals(pdesc); ++ ++ pr_warn("No GPIO signal type found on pin %s (%d). Found: %s\n", ++ pdesc->name, offset, signals); ++ kfree(signals); ++ ++ return; ++ } ++ ++ /* ++ * Pass-through should be one priority higher than the GPIO function, ++ * so decrement our prios and enable that function ++ */ ++ prios--; ++ funcs = *prios; ++ expr = *funcs; ++ aspeed_sig_expr_enable(&pdata->pinmux, expr); ++} ++ + int aspeed_pinctrl_probe(struct platform_device *pdev, + struct pinctrl_desc *pdesc, + struct aspeed_pinctrl_data *pdata) +diff --git a/drivers/pinctrl/aspeed/pinctrl-aspeed.h b/drivers/pinctrl/aspeed/pinctrl-aspeed.h +index a5d83986f32e..c1104341e202 100644 +--- a/drivers/pinctrl/aspeed/pinctrl-aspeed.h ++++ b/drivers/pinctrl/aspeed/pinctrl-aspeed.h +@@ -67,6 +67,9 @@ int aspeed_pinmux_set_mux(struct pinctrl_dev *pctldev, unsigned int function, + int aspeed_gpio_request_enable(struct pinctrl_dev *pctldev, + struct pinctrl_gpio_range *range, + unsigned int offset); ++void aspeed_gpio_disable_free(struct pinctrl_dev *pctldev, ++ struct pinctrl_gpio_range *range, ++ unsigned int offset); + int aspeed_pinctrl_probe(struct platform_device *pdev, + struct pinctrl_desc *pdesc, + struct aspeed_pinctrl_data *pdata); +-- +2.7.4 + diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0003-Enable-GPIOE0-and-GPIOE2-pass-through-by-default.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0003-Enable-GPIOE0-and-GPIOE2-pass-through-by-default.patch new file mode 100644 index 000000000..a5bd4d08e --- /dev/null +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0003-Enable-GPIOE0-and-GPIOE2-pass-through-by-default.patch @@ -0,0 +1,70 @@ +From fa75e700680ea87ab5aa9722bde1667c572f2fe8 Mon Sep 17 00:00:00 2001 +From: "Jason M. Bills" <jason.m.bills@linux.intel.com> +Date: Mon, 6 May 2019 14:18:27 -0700 +Subject: [PATCH] Enable GPIOE0 and GPIOE2 pass-through by default + +This change sets the gpio DT pinctrl default configuration to +enable GPIOE0 and GPIOE2 pass-through. Since this causes +pinctrl_get_select_default() to be called automatically for +the gpio driver to claim the GPIO pins in those groups, we +also need to call pinctrl_put() to release claim on the +pass-through GPIOs so they can be requested at runtime. + +Tested: +Disabled pass-through in uboot and confirmed that after booting +Linux, pass-through is enabled and 'cat /sys/kernel/debug/pinctrl/ +1e6e2000.syscon\:pinctrl-aspeed-g5-pinctrl/pinmux-pins' shows that +the pass-through GPIOs are UNCLAIMED. + +Signed-off-by: Jason M. Bills <jason.m.bills@linux.intel.com> +--- + arch/arm/boot/dts/aspeed-bmc-intel-purley.dts | 4 ++++ + drivers/gpio/gpio-aspeed.c | 10 ++++++++++ + 2 files changed, 14 insertions(+) + +diff --git a/arch/arm/boot/dts/aspeed-bmc-intel-purley.dts b/arch/arm/boot/dts/aspeed-bmc-intel-purley.dts +index 040b345f55e1..bc6bb41a8e68 100644 +--- a/arch/arm/boot/dts/aspeed-bmc-intel-purley.dts ++++ b/arch/arm/boot/dts/aspeed-bmc-intel-purley.dts +@@ -117,6 +117,10 @@ + + &gpio { + status = "okay"; ++ /* Enable GPIOE0 and GPIOE2 pass-through by default */ ++ pinctrl-names = "pass-through"; ++ pinctrl-0 = <&pinctrl_gpie0_default ++ &pinctrl_gpie2_default>; + gpio-line-names = + /*A0-A7*/ "","","","","","","","", + /*B0-B7*/ "","","","","","","","", +diff --git a/drivers/gpio/gpio-aspeed.c b/drivers/gpio/gpio-aspeed.c +index 09e53c5f3b0a..ac33f8134fe6 100644 +--- a/drivers/gpio/gpio-aspeed.c ++++ b/drivers/gpio/gpio-aspeed.c +@@ -1140,6 +1140,7 @@ static int __init aspeed_gpio_probe(struct platform_device *pdev) + { + const struct of_device_id *gpio_id; + struct aspeed_gpio *gpio; ++ struct pinctrl *pinctrl; + int rc, i, banks, err; + u32 ngpio; + +@@ -1190,6 +1191,15 @@ static int __init aspeed_gpio_probe(struct platform_device *pdev) + return -ENOMEM; + + /* ++ * Select the pass-through pinctrl config to enable the pass-through ++ * mux for GPIOs E0 and E2. Then call pinctrl_put() to release claim ++ * of the GPIO pins, so they can be requested at runtime. ++ */ ++ pinctrl = pinctrl_get_select(&pdev->dev, "pass-through"); ++ if (pinctrl) ++ pinctrl_put(pinctrl); ++ ++ /* + * Populate it with initial values read from the HW and switch + * all command sources to the ARM by default + */ +-- +2.7.4 + diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0005-128MB-flashmap-for-PFR.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0005-128MB-flashmap-for-PFR.patch new file mode 100644 index 000000000..14b7154bf --- /dev/null +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0005-128MB-flashmap-for-PFR.patch @@ -0,0 +1,30 @@ +From 9a71adc7aecbfdf066ba54c763c2ecd8fb09d3cd Mon Sep 17 00:00:00 2001 +From: Vikram Bodireddy <vikram.bodireddy@intel.com> +Date: Wed, 6 Feb 2019 15:59:34 +0530 +Subject: [PATCH] Selecting 128MB for PFR + +PFR platforms requires 128MB flash mapping. +This will override the existing 64MB flash map +and loads 128MB flash map. + +Signed-off-by: Vikram Bodireddy <vikram.bodireddy@intel.com> +--- + arch/arm/boot/dts/aspeed-bmc-intel-purley.dts | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/boot/dts/aspeed-bmc-intel-purley.dts b/arch/arm/boot/dts/aspeed-bmc-intel-purley.dts +index 4815104459f1..df02bb1aaf36 100644 +--- a/arch/arm/boot/dts/aspeed-bmc-intel-purley.dts ++++ b/arch/arm/boot/dts/aspeed-bmc-intel-purley.dts +@@ -89,7 +89,7 @@ + flash@0 { + status = "okay"; + m25p,fast-read; +-#include "openbmc-flash-layout-intel-64MB.dtsi" ++#include "openbmc-flash-layout-intel-128MB.dtsi" + }; + }; + +-- +2.7.4 + diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0006-Allow-monitoring-of-power-control-input-GPIOs.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0006-Allow-monitoring-of-power-control-input-GPIOs.patch new file mode 100644 index 000000000..c84746359 --- /dev/null +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0006-Allow-monitoring-of-power-control-input-GPIOs.patch @@ -0,0 +1,80 @@ +From e9d15bf9fdec1cd17c2ed335566b7d463d63fbdb Mon Sep 17 00:00:00 2001 +From: "Jason M. Bills" <jason.m.bills@linux.intel.com> +Date: Fri, 24 May 2019 12:42:59 -0700 +Subject: [PATCH] Allow monitoring of power control input GPIOs + +The pass-through input GPIOs cannot be monitored because when +requested, pass-through is disabled which causes a change on the +pass-through output. + +The SIO GPIOs cannot be monitored because when requested, the +request is rejected based on the value of the ACPI strap. + +This change removes the register check condition from the pass- +through and desired SIO GPIOs so they can be requsted and +monitored from power control. + +Tested: +For pass-through, I used gpioset to hold a request on the input +GPIOs and confirmed that pass-through remained enabled. + +For SIO, I used gpioget to confirm that I can successfully request +and read the GPIO value. + +Signed-off-by: Jason M. Bills <jason.m.bills@linux.intel.com> +--- + drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c b/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c +index 5e7f53fab76e..b08b5325edb1 100644 +--- a/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c ++++ b/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c +@@ -279,7 +279,7 @@ FUNC_GROUP_DECL(SD2, F19, E21, F20, D20, D21, E20, G18, C21); + + #define B20 32 + SIG_EXPR_LIST_DECL_SINGLE(B20, NCTS3, NCTS3, SIG_DESC_SET(SCU80, 16)); +-SIG_EXPR_DECL_SINGLE(GPIE0IN, GPIE0, GPIE0_DESC); ++SIG_EXPR_DECL_SINGLE(GPIE0IN, GPIE0); + SIG_EXPR_DECL_SINGLE(GPIE0IN, GPIE, GPIE_DESC); + SIG_EXPR_LIST_DECL_DUAL(B20, GPIE0IN, GPIE0, GPIE); + PIN_DECL_2(B20, GPIOE0, NCTS3, GPIE0IN); +@@ -299,7 +299,7 @@ FUNC_GROUP_DECL(GPIE0, B20, C20); + + #define F18 34 + SIG_EXPR_LIST_DECL_SINGLE(F18, NDSR3, NDSR3, SIG_DESC_SET(SCU80, 18)); +-SIG_EXPR_DECL_SINGLE(GPIE2IN, GPIE2, GPIE2_DESC); ++SIG_EXPR_DECL_SINGLE(GPIE2IN, GPIE2); + SIG_EXPR_DECL_SINGLE(GPIE2IN, GPIE, GPIE_DESC); + SIG_EXPR_LIST_DECL_DUAL(F18, GPIE2IN, GPIE2, GPIE); + PIN_DECL_2(F18, GPIOE2, NDSR3, GPIE2IN); +@@ -1412,7 +1412,7 @@ FUNC_GROUP_DECL(ADC15, H4); + + #define R22 192 + SIG_EXPR_DECL_SINGLE(SIOS3, SIOS3, SIG_DESC_SET(SCUA4, 8)); +-SIG_EXPR_DECL_SINGLE(SIOS3, ACPI, ACPI_DESC); ++SIG_EXPR_DECL_SINGLE(SIOS3, ACPI); + SIG_EXPR_LIST_DECL_DUAL(R22, SIOS3, SIOS3, ACPI); + SIG_EXPR_LIST_DECL_SINGLE(R22, DASHR22, DASHR22, SIG_DESC_SET(SCU94, 10)); + PIN_DECL_2(R22, GPIOY0, SIOS3, DASHR22); +@@ -1420,7 +1420,7 @@ FUNC_GROUP_DECL(SIOS3, R22); + + #define R21 193 + SIG_EXPR_DECL_SINGLE(SIOS5, SIOS5, SIG_DESC_SET(SCUA4, 9)); +-SIG_EXPR_DECL_SINGLE(SIOS5, ACPI, ACPI_DESC); ++SIG_EXPR_DECL_SINGLE(SIOS5, ACPI); + SIG_EXPR_LIST_DECL_DUAL(R21, SIOS5, SIOS5, ACPI); + SIG_EXPR_LIST_DECL_SINGLE(R21, DASHR21, DASHR21, SIG_DESC_SET(SCU94, 10)); + PIN_DECL_2(R21, GPIOY1, SIOS5, DASHR21); +@@ -1436,7 +1436,7 @@ FUNC_GROUP_DECL(SIOPWREQ, P22); + + #define P21 195 + SIG_EXPR_DECL_SINGLE(SIOONCTRL, SIOONCTRL, SIG_DESC_SET(SCUA4, 11)); +-SIG_EXPR_DECL_SINGLE(SIOONCTRL, ACPI, ACPI_DESC); ++SIG_EXPR_DECL_SINGLE(SIOONCTRL, ACPI); + SIG_EXPR_LIST_DECL_DUAL(P21, SIOONCTRL, SIOONCTRL, ACPI); + SIG_EXPR_LIST_DECL_SINGLE(P21, DASHP21, DASHP21, SIG_DESC_SET(SCU94, 11)); + PIN_DECL_2(P21, GPIOY3, SIOONCTRL, DASHP21); +-- +2.7.4 + diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0007-aspeed-pwm-tacho-change-default-fan-speed.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0007-aspeed-pwm-tacho-change-default-fan-speed.patch new file mode 100644 index 000000000..476a07043 --- /dev/null +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0007-aspeed-pwm-tacho-change-default-fan-speed.patch @@ -0,0 +1,28 @@ +From b7e8941cf3b1c1c42330207600c91fb23781a77b Mon Sep 17 00:00:00 2001 +From: James Feist <james.feist@linux.intel.com> +Date: Tue, 2 Jul 2019 10:14:59 -0700 +Subject: [PATCH] aspeed-pwm-tacho: change default fan speed + +Change it from max to 58% + +Signed-off-by: James Feist <james.feist@linux.intel.com> +--- + drivers/hwmon/aspeed-pwm-tacho.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/hwmon/aspeed-pwm-tacho.c b/drivers/hwmon/aspeed-pwm-tacho.c +index 40c489be62ea..ae5771f881b5 100644 +--- a/drivers/hwmon/aspeed-pwm-tacho.c ++++ b/drivers/hwmon/aspeed-pwm-tacho.c +@@ -160,7 +160,7 @@ + */ + #define M_TACH_MODE 0x02 /* 10b */ + #define M_TACH_UNIT 0x0210 +-#define INIT_FAN_CTRL 0xFF ++#define INIT_FAN_CTRL 150 /* 58% */ + + /* How long we sleep in us while waiting for an RPM result. */ + #define ASPEED_RPM_STATUS_SLEEP_USEC 500 +-- +2.7.4 + diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0008-Report-link-statistics-for-the-NCSI-channel.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0008-Report-link-statistics-for-the-NCSI-channel.patch new file mode 100644 index 000000000..643deb659 --- /dev/null +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0008-Report-link-statistics-for-the-NCSI-channel.patch @@ -0,0 +1,54 @@ +From f3300099b6638df5829e75b1fbfbb6e7ebc8b2b9 Mon Sep 17 00:00:00 2001 +From: Johnathan Mantey <johnathanx.mantey@intel.com> +Date: Thu, 1 Aug 2019 11:29:41 -0700 +Subject: [PATCH] Report link statistics for the NCSI channel + +The ftgmac driver does not report the link statistics for the NCSI +channel used for the shared NICs attached to the BMC. Report a fixed +value for the NSCI interface. + +Change-Id: Idb65ca1ce07f06a883417ee44df30ea2c8483107 +Signed-off-by: Johnathan Mantey <johnathanx.mantey@intel.com> +--- + drivers/net/ethernet/faraday/ftgmac100.c | 22 +++++++++++++++++++++- + 1 file changed, 21 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c +index 9b7af94a40bb..4cd679233795 100644 +--- a/drivers/net/ethernet/faraday/ftgmac100.c ++++ b/drivers/net/ethernet/faraday/ftgmac100.c +@@ -1216,10 +1216,30 @@ static int ftgmac100_set_pauseparam(struct net_device *netdev, + return 0; + } + ++int ftgmac100_ethtool_get_link_ksettings(struct net_device *netdev, ++ struct ethtool_link_ksettings *cmd) ++{ ++ struct phy_device *phydev = netdev->phydev; ++ struct ftgmac100 *priv = netdev_priv(netdev); ++ int retval = 0; ++ ++ if (phydev) { ++ phy_ethtool_ksettings_get(phydev, cmd); ++ } else if (priv->use_ncsi) { ++ cmd->base.speed = SPEED_100; ++ cmd->base.duplex = DUPLEX_FULL; ++ cmd->base.autoneg = 0; ++ } else { ++ retval = -ENODEV; ++ } ++ ++ return retval; ++} ++ + static const struct ethtool_ops ftgmac100_ethtool_ops = { + .get_drvinfo = ftgmac100_get_drvinfo, + .get_link = ethtool_op_get_link, +- .get_link_ksettings = phy_ethtool_get_link_ksettings, ++ .get_link_ksettings = ftgmac100_ethtool_get_link_ksettings, + .set_link_ksettings = phy_ethtool_set_link_ksettings, + .nway_reset = phy_ethtool_nway_reset, + .get_ringparam = ftgmac100_get_ringparam, +-- +2.7.4 + diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0005-arm-dts-aspeed-g5-add-espi.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0014-arm-dts-aspeed-g5-add-espi.patch index 165596f25..094fc8396 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0005-arm-dts-aspeed-g5-add-espi.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0014-arm-dts-aspeed-g5-add-espi.patch @@ -1,4 +1,4 @@ -From f72d4767835e530ce6bc4673ff30cc1099c88af5 Mon Sep 17 00:00:00 2001 +From b70fe24abeef901b3ba8e32b5e5d8aaf35ec061d Mon Sep 17 00:00:00 2001 From: Juston Li <juston.li@intel.com> Date: Mon, 27 Mar 2017 11:16:00 -0700 Subject: [PATCH] arm: dts: aspeed-g5: add espi @@ -9,19 +9,19 @@ Signed-off-by: Juston Li <juston.li@intel.com> 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index dc58eb8c6969..db82f47339aa 100644 +index 00f05bd3375d..271f3c96456a 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -283,7 +283,7 @@ +@@ -311,7 +311,7 @@ #gpio-cells = <2>; gpio-controller; compatible = "aspeed,ast2500-gpio"; - reg = <0x1e780000 0x1000>; + reg = <0x1e780000 0x0200>; interrupts = <20>; - gpio-ranges = <&pinctrl 0 0 220>; + gpio-ranges = <&pinctrl 0 0 232>; clocks = <&syscon ASPEED_CLK_APB>; -@@ -291,6 +291,15 @@ +@@ -319,6 +319,15 @@ #interrupt-cells = <2>; }; @@ -37,7 +37,7 @@ index dc58eb8c6969..db82f47339aa 100644 rtc: rtc@1e781000 { compatible = "aspeed,ast2500-rtc"; reg = <0x1e781000 0x18>; -@@ -366,6 +375,13 @@ +@@ -394,6 +403,13 @@ status = "disabled"; }; diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0007-New-flash-map-for-intel.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0015-New-flash-map-for-intel.patch index 695491d28..695491d28 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0007-New-flash-map-for-intel.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0015-New-flash-map-for-intel.patch diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0008-Add-ASPEED-SGPIO-driver.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0016-Add-ASPEED-SGPIO-driver.patch index 146a725dd..07bdf60af 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0008-Add-ASPEED-SGPIO-driver.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0016-Add-ASPEED-SGPIO-driver.patch @@ -1,4 +1,4 @@ -From e6923abbc90b5b00bc9ea401fbb2a28971d19cbe Mon Sep 17 00:00:00 2001 +From ab104c6067683a3a251e2814991474243b7e1cb8 Mon Sep 17 00:00:00 2001 From: "Feist, James" <james.feist@intel.com> Date: Tue, 4 Jun 2019 14:00:39 -0700 Subject: [PATCH] gpio: aspeed: add ASPEED SGPIO driver @@ -10,21 +10,21 @@ Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> --- drivers/gpio/Kconfig | 8 + drivers/gpio/Makefile | 1 + - drivers/gpio/sgpio-aspeed.c | 708 ++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 717 insertions(+) + drivers/gpio/sgpio-aspeed.c | 703 ++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 712 insertions(+) create mode 100644 drivers/gpio/sgpio-aspeed.c diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig -index acd40eb51c46..20808e48229a 100644 +index bb13c266c329..4061686d8651 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig -@@ -124,6 +124,14 @@ config GPIO_ASPEED +@@ -120,6 +120,14 @@ config GPIO_ASPEED help Say Y here to support Aspeed AST2400 and AST2500 GPIO controllers. +config SGPIO_ASPEED -+ bool "ASPEED SGPIO support" -+ depends on ARCH_ASPEED ++ tristate "ASPEED SGPIO support" ++ depends on (ARCH_ASPEED || COMPILE_TEST) && OF_GPIO + select GPIO_GENERIC + select GPIOLIB_IRQCHIP + help @@ -34,23 +34,23 @@ index acd40eb51c46..20808e48229a 100644 tristate "Atheros AR71XX/AR724X/AR913X GPIO support" default y if ATH79 diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile -index 6700eee860b7..77c6ec0ee98f 100644 +index a4e91175c708..bebbd8205c11 100644 --- a/drivers/gpio/Makefile +++ b/drivers/gpio/Makefile -@@ -33,6 +33,7 @@ obj-$(CONFIG_GPIO_AMDPT) += gpio-amdpt.o - obj-$(CONFIG_GPIO_ARIZONA) += gpio-arizona.o - obj-$(CONFIG_GPIO_ATH79) += gpio-ath79.o - obj-$(CONFIG_GPIO_ASPEED) += gpio-aspeed.o -+obj-$(CONFIG_SGPIO_ASPEED) += sgpio-aspeed.o - obj-$(CONFIG_GPIO_RASPBERRYPI_EXP) += gpio-raspberrypi-exp.o - obj-$(CONFIG_GPIO_BCM_KONA) += gpio-bcm-kona.o - obj-$(CONFIG_GPIO_BD9571MWV) += gpio-bd9571mwv.o +@@ -32,6 +32,7 @@ obj-$(CONFIG_GPIO_AMD_FCH) += gpio-amd-fch.o + obj-$(CONFIG_GPIO_AMDPT) += gpio-amdpt.o + obj-$(CONFIG_GPIO_ARIZONA) += gpio-arizona.o + obj-$(CONFIG_GPIO_ASPEED) += gpio-aspeed.o ++obj-$(CONFIG_SGPIO_ASPEED) += sgpio-aspeed.o + obj-$(CONFIG_GPIO_ATH79) += gpio-ath79.o + obj-$(CONFIG_GPIO_BCM_KONA) += gpio-bcm-kona.o + obj-$(CONFIG_GPIO_BD70528) += gpio-bd70528.o diff --git a/drivers/gpio/sgpio-aspeed.c b/drivers/gpio/sgpio-aspeed.c new file mode 100644 -index 000000000000..6fb402a3f74d +index 000000000000..b6e9ccee774d --- /dev/null +++ b/drivers/gpio/sgpio-aspeed.c -@@ -0,0 +1,708 @@ +@@ -0,0 +1,703 @@ +// SPDX-License-Identifier: GPL-2.0+ +// Copyright (c) 2019 Intel Corporation + @@ -87,12 +87,11 @@ index 000000000000..6fb402a3f74d + +struct aspeed_sgpio { + struct gpio_chip chip; ++ struct irq_chip irqc; + spinlock_t lock; + void __iomem *base; + int irq; + const struct aspeed_sgpio_config *config; -+ -+ u32 *dcache; +}; + +struct aspeed_sgpio_bank { @@ -310,6 +309,8 @@ index 000000000000..6fb402a3f74d + if (!have_output(gpio, offset)) + return -ENOTSUPP; + ++ aspeed_sgpio_set(gc, offset, val); ++ + return 0; +} + @@ -498,16 +499,11 @@ index 000000000000..6fb402a3f74d + chained_irq_exit(ic, desc); +} + -+static struct irq_chip aspeed_sgpio_irqchip = { -+ .name = "aspeed-sgpio", -+ .irq_ack = aspeed_sgpio_irq_ack, -+ .irq_mask = aspeed_sgpio_irq_mask, -+ .irq_unmask = aspeed_sgpio_irq_unmask, -+ .irq_set_type = aspeed_sgpio_set_type, -+}; -+ -+static void set_irq_valid_mask(struct aspeed_sgpio *gpio) ++static void aspeed_sgpio_init_irq_valid_mask(struct gpio_chip *gc, ++ unsigned long *valid_mask, ++ unsigned int ngpios) +{ ++ struct aspeed_sgpio *gpio = gpiochip_get_data(gc); + const struct aspeed_bank_props *props = gpio->config->props; + + while (!is_bank_props_sentinel(props)) { @@ -518,10 +514,10 @@ index 000000000000..6fb402a3f74d + for_each_clear_bit(offset, &input, 32) { + unsigned int i = props->bank * 32 + offset; + -+ if (i >= gpio->config->nr_gpios) ++ if (i >= gpio->chip.ngpio) + break; + -+ clear_bit(i, gpio->chip.irq.valid_mask); ++ clear_bit(i, valid_mask); + } + + props++; @@ -529,9 +525,10 @@ index 000000000000..6fb402a3f74d +} + +static int aspeed_sgpio_setup_irqs(struct aspeed_sgpio *gpio, -+ struct platform_device *pdev) ++ struct platform_device *pdev) +{ + const struct aspeed_sgpio_bank *bank; ++ struct gpio_irq_chip *girq; + int rc, i; + + /* Initialize IRQ and tolerant settings */ @@ -561,18 +558,24 @@ index 000000000000..6fb402a3f74d + return rc; + + gpio->irq = rc; -+ -+ set_irq_valid_mask(gpio); -+ -+ rc = gpiochip_irqchip_add(&gpio->chip, &aspeed_sgpio_irqchip, -+ 0, handle_bad_irq, IRQ_TYPE_NONE); -+ if (rc) { -+ dev_info(&pdev->dev, "Could not add irqchip\n"); -+ return rc; -+ } -+ -+ gpiochip_set_chained_irqchip(&gpio->chip, &aspeed_sgpio_irqchip, -+ gpio->irq, aspeed_sgpio_irq_handler); ++ girq = &gpio->chip.irq; ++ girq->chip = &gpio->irqc; ++ girq->chip->name = dev_name(&pdev->dev); ++ girq->chip->irq_ack = aspeed_sgpio_irq_ack; ++ girq->chip->irq_mask = aspeed_sgpio_irq_mask; ++ girq->chip->irq_unmask = aspeed_sgpio_irq_unmask; ++ girq->chip->irq_set_type = aspeed_sgpio_set_type; ++ girq->parent_handler = aspeed_sgpio_irq_handler; ++ girq->num_parents = 1; ++ girq->parents = devm_kcalloc(&pdev->dev, 1, ++ sizeof(*girq->parents), ++ GFP_KERNEL); ++ if (!girq->parents) ++ return -ENOMEM; ++ girq->parents[0] = gpio->irq; ++ girq->default_type = IRQ_TYPE_NONE; ++ girq->handler = handle_bad_irq; ++ girq->init_valid_mask = aspeed_sgpio_init_irq_valid_mask; + + return 0; +} @@ -658,7 +661,7 @@ index 000000000000..6fb402a3f74d + struct aspeed_sgpio *gpio; + unsigned long src_freq; + struct clk *clk; -+ int rc, banks; ++ int rc; + + gpio = devm_kzalloc(&pdev->dev, sizeof(*gpio), GFP_KERNEL); + if (!gpio) @@ -684,8 +687,10 @@ index 000000000000..6fb402a3f74d + + clk = devm_clk_get(&pdev->dev, NULL); + if (IS_ERR(clk)) { -+ dev_err(&pdev->dev, "Failed to get clk source.\n"); -+ return PTR_ERR(clk); ++ rc = PTR_ERR(clk); ++ if (rc != -EPROBE_DEFER) ++ dev_err(&pdev->dev, "Failed to get clk source.\n"); ++ return rc; + } + + /* @@ -729,22 +734,12 @@ index 000000000000..6fb402a3f74d + gpio->chip.set_config = aspeed_sgpio_set_config; + gpio->chip.label = dev_name(&pdev->dev); + gpio->chip.base = -1; -+ gpio->chip.irq.need_valid_mask = true; -+ -+ /* Allocate a cache of the output registers */ -+ banks = gpio->config->nr_gpios >> 5; -+ -+ gpio->dcache = devm_kcalloc(&pdev->dev, -+ banks, sizeof(u32), GFP_KERNEL); -+ -+ if (!gpio->dcache) -+ return -ENOMEM; + -+ rc = devm_gpiochip_add_data(&pdev->dev, &gpio->chip, gpio); ++ rc = aspeed_sgpio_setup_irqs(gpio, pdev); + if (rc < 0) + return rc; + -+ return aspeed_sgpio_setup_irqs(gpio, pdev); ++ return devm_gpiochip_add_data(&pdev->dev, &gpio->chip, gpio); +} + +static struct platform_driver aspeed_sgpio_driver = { diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0009-SGPIO-DT-and-pinctrl-fixup.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0017-SGPIO-DT-and-pinctrl-fixup.patch index 4210d9f67..6bfcb43c4 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0009-SGPIO-DT-and-pinctrl-fixup.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0017-SGPIO-DT-and-pinctrl-fixup.patch @@ -1,4 +1,4 @@ -From 0f63ecc25766fdf66610d08441e59147a4cbde78 Mon Sep 17 00:00:00 2001 +From 4c5ab7c103b693096ae719abd16bc80b81043beb Mon Sep 17 00:00:00 2001 From: Vernon Mauery <vernon.mauery@intel.com> Date: Wed, 16 May 2018 10:03:14 -0700 Subject: [PATCH] SGPIO DT and pinctrl fixup @@ -9,16 +9,15 @@ Signed-off-by: Vernon Mauery <vernon.mauery@intel.com> Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> --- arch/arm/boot/dts/aspeed-g4.dtsi | 56 +++++++++++------------------- - arch/arm/boot/dts/aspeed-g5.dtsi | 10 ++++++ + arch/arm/boot/dts/aspeed-g5.dtsi | 5 +++ drivers/pinctrl/aspeed/pinctrl-aspeed-g4.c | 48 ++++++++++++------------- - drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c | 4 +++ - 4 files changed, 58 insertions(+), 60 deletions(-) + 3 files changed, 49 insertions(+), 60 deletions(-) diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi b/arch/arm/boot/dts/aspeed-g4.dtsi -index fd857be397bf..58306a8232c9 100644 +index cc78564b2f8d..ee86b41af291 100644 --- a/arch/arm/boot/dts/aspeed-g4.dtsi +++ b/arch/arm/boot/dts/aspeed-g4.dtsi -@@ -207,6 +207,20 @@ +@@ -255,6 +255,20 @@ #interrupt-cells = <2>; }; @@ -39,7 +38,7 @@ index fd857be397bf..58306a8232c9 100644 timer: timer@1e782000 { /* This timer is a Faraday FTTMR010 derivative */ compatible = "aspeed,ast2400-timer"; -@@ -1180,44 +1194,14 @@ +@@ -1228,44 +1242,14 @@ groups = "SD2"; }; @@ -91,10 +90,10 @@ index fd857be397bf..58306a8232c9 100644 pinctrl_sioonctrl_default: sioonctrl_default { diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index db82f47339aa..425a542690de 100644 +index 271f3c96456a..128e0b5bbae2 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -298,6 +298,11 @@ +@@ -326,6 +326,11 @@ reg = <0x1e780200 0x0100>; interrupts = <40>; interrupt-controller; @@ -106,77 +105,65 @@ index db82f47339aa..425a542690de 100644 }; rtc: rtc@1e781000 { -@@ -1403,6 +1408,11 @@ - groups = "SDA2"; - }; - -+ pinctrl_sgpm_default: sgpm_default { -+ function = "SGPM"; -+ groups = "SGPM"; -+ }; -+ - pinctrl_sgps1_default: sgps1_default { - function = "SGPS1"; - groups = "SGPS1"; diff --git a/drivers/pinctrl/aspeed/pinctrl-aspeed-g4.c b/drivers/pinctrl/aspeed/pinctrl-aspeed-g4.c -index 384396cbb22d..a78ed8c33e96 100644 +index 95ea593fa29d..70284c5f9ad9 100644 --- a/drivers/pinctrl/aspeed/pinctrl-aspeed-g4.c +++ b/drivers/pinctrl/aspeed/pinctrl-aspeed-g4.c -@@ -423,16 +423,22 @@ SSSF_PIN_DECL(E16, GPIOF6, TXD4, SIG_DESC_SET(SCU80, 30)); +@@ -430,16 +430,22 @@ SSSF_PIN_DECL(E16, GPIOF6, TXD4, SIG_DESC_SET(SCU80, 30)); SSSF_PIN_DECL(C17, GPIOF7, RXD4, SIG_DESC_SET(SCU80, 31)); #define A14 48 -SSSF_PIN_DECL(A14, GPIOG0, SGPSCK, SIG_DESC_SET(SCU84, 0)); -+SIG_EXPR_LIST_DECL_SINGLE(SGPSCK, SGPS, SIG_DESC_SET(SCU84, 0)); -+SS_PIN_DECL(A14, GPIOG0, SGPSCK); ++SIG_EXPR_LIST_DECL_SINGLE(A14, SGPSCK, SGPS, SIG_DESC_SET(SCU84, 0)); ++PIN_DECL_1(A14, GPIOG0, SGPSCK); #define E13 49 -SSSF_PIN_DECL(E13, GPIOG1, SGPSLD, SIG_DESC_SET(SCU84, 1)); -+SIG_EXPR_LIST_DECL_SINGLE(SGPSLD, SGPS, SIG_DESC_SET(SCU84, 1)); -+SS_PIN_DECL(E13, GPIOG1, SGPSLD); ++SIG_EXPR_LIST_DECL_SINGLE(E13, SGPSLD, SGPS, SIG_DESC_SET(SCU84, 1)); ++PIN_DECL_1(E13, GPIOG1, SGPSLD); #define D13 50 -SSSF_PIN_DECL(D13, GPIOG2, SGPSI0, SIG_DESC_SET(SCU84, 2)); -+SIG_EXPR_LIST_DECL_SINGLE(SGPSIO, SGPS, SIG_DESC_SET(SCU84, 2)); -+SS_PIN_DECL(D13, GPIOG2, SGPSIO); ++SIG_EXPR_LIST_DECL_SINGLE(D13, SGPSIO, SGPS, SIG_DESC_SET(SCU84, 2)); ++PIN_DECL_1(D13, GPIOG2, SGPSIO); #define C13 51 -SSSF_PIN_DECL(C13, GPIOG3, SGPSI1, SIG_DESC_SET(SCU84, 3)); -+SIG_EXPR_LIST_DECL_SINGLE(SGPSI1, SGPS, SIG_DESC_SET(SCU84, 3)); -+SS_PIN_DECL(C13, GPIOG3, SGPSI1); ++SIG_EXPR_LIST_DECL_SINGLE(C13, SGPSI1, SGPS, SIG_DESC_SET(SCU84, 3)); ++PIN_DECL_1(C13, GPIOG3, SGPSI1); + +FUNC_GROUP_DECL(SGPS, A14, E13, D13, C13); #define B13 52 - SIG_EXPR_LIST_DECL_SINGLE(OSCCLK, OSCCLK, SIG_DESC_SET(SCU2C, 1)); -@@ -598,16 +604,22 @@ FUNC_GROUP_DECL(SPI1PASSTHRU, C22, G18, D19, C20, B22, G19, C18, E20); + SIG_EXPR_LIST_DECL_SINGLE(B13, OSCCLK, OSCCLK, SIG_DESC_SET(SCU2C, 1)); +@@ -613,16 +619,22 @@ FUNC_GROUP_DECL(SPI1PASSTHRU, C22, G18, D19, C20, B22, G19, C18, E20); FUNC_GROUP_DECL(VGABIOS_ROM, B22, G19, C18, E20); #define J5 72 -SSSF_PIN_DECL(J5, GPIOJ0, SGPMCK, SIG_DESC_SET(SCU84, 8)); -+SIG_EXPR_LIST_DECL_SINGLE(SGPMCK, SGPM, SIG_DESC_SET(SCU84, 8)); -+SS_PIN_DECL(J5, GPIOJ0, SGPMCK); ++SIG_EXPR_LIST_DECL_SINGLE(J5, SGPMCK, SGPM, SIG_DESC_SET(SCU84, 8)); ++PIN_DECL_1(J5, GPIOJ0, SGPMCK); #define J4 73 -SSSF_PIN_DECL(J4, GPIOJ1, SGPMLD, SIG_DESC_SET(SCU84, 9)); -+SIG_EXPR_LIST_DECL_SINGLE(SGPMLD, SGPM, SIG_DESC_SET(SCU84, 9)); -+SS_PIN_DECL(J4, GPIOJ1, SGPMLD); ++SIG_EXPR_LIST_DECL_SINGLE(J4, SGPMLD, SGPM, SIG_DESC_SET(SCU84, 9)); ++PIN_DECL_1(J4, GPIOJ1, SGPMLD); #define K5 74 -SSSF_PIN_DECL(K5, GPIOJ2, SGPMO, SIG_DESC_SET(SCU84, 10)); -+SIG_EXPR_LIST_DECL_SINGLE(SGPMO, SGPM, SIG_DESC_SET(SCU84, 10)); -+SS_PIN_DECL(K5, GPIOJ2, SGPMO); ++SIG_EXPR_LIST_DECL_SINGLE(K5, SGPMO, SGPM, SIG_DESC_SET(SCU84, 10)); ++PIN_DECL_1(K5, GPIOJ2, SGPMO); #define J3 75 -SSSF_PIN_DECL(J3, GPIOJ3, SGPMI, SIG_DESC_SET(SCU84, 11)); -+SIG_EXPR_LIST_DECL_SINGLE(SGPMI, SGPM, SIG_DESC_SET(SCU84, 11)); -+SS_PIN_DECL(J3, GPIOJ3, SGPMI); ++SIG_EXPR_LIST_DECL_SINGLE(J3, SGPMI, SGPM, SIG_DESC_SET(SCU84, 11)); ++PIN_DECL_1(J3, GPIOJ3, SGPMI); + +FUNC_GROUP_DECL(SGPM, J5, J4, K5, J3); #define T4 76 SSSF_PIN_DECL(T4, GPIOJ4, VGAHS, SIG_DESC_SET(SCU84, 12)); -@@ -2105,14 +2117,8 @@ static const struct aspeed_pin_group aspeed_g4_groups[] = { +@@ -2234,14 +2246,8 @@ static const struct aspeed_pin_group aspeed_g4_groups[] = { ASPEED_PINCTRL_GROUP(SALT4), ASPEED_PINCTRL_GROUP(SD1), ASPEED_PINCTRL_GROUP(SD2), @@ -193,7 +180,7 @@ index 384396cbb22d..a78ed8c33e96 100644 ASPEED_PINCTRL_GROUP(SIOONCTRL), ASPEED_PINCTRL_GROUP(SIOPBI), ASPEED_PINCTRL_GROUP(SIOPBO), -@@ -2260,14 +2266,8 @@ static const struct aspeed_pin_function aspeed_g4_functions[] = { +@@ -2389,14 +2395,8 @@ static const struct aspeed_pin_function aspeed_g4_functions[] = { ASPEED_PINCTRL_FUNC(SALT4), ASPEED_PINCTRL_FUNC(SD1), ASPEED_PINCTRL_FUNC(SD2), @@ -210,35 +197,6 @@ index 384396cbb22d..a78ed8c33e96 100644 ASPEED_PINCTRL_FUNC(SIOONCTRL), ASPEED_PINCTRL_FUNC(SIOPBI), ASPEED_PINCTRL_FUNC(SIOPBO), -diff --git a/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c b/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c -index 6f151e7c8d81..c088f010c554 100644 ---- a/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c -+++ b/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c -@@ -599,6 +599,8 @@ SS_PIN_DECL(N3, GPIOJ2, SGPMO); - SIG_EXPR_LIST_DECL_SINGLE(SGPMI, SGPM, SIG_DESC_SET(SCU84, 11)); - SS_PIN_DECL(N4, GPIOJ3, SGPMI); - -+FUNC_GROUP_DECL(SGPM, R2, L2, N3, N4); -+ - #define N5 76 - SIG_EXPR_LIST_DECL_SINGLE(VGAHS, VGAHS, SIG_DESC_SET(SCU84, 12)); - SIG_EXPR_LIST_DECL_SINGLE(DASHN5, DASHN5, SIG_DESC_SET(SCU94, 8)); -@@ -2149,6 +2151,7 @@ static const struct aspeed_pin_group aspeed_g5_groups[] = { - ASPEED_PINCTRL_GROUP(SD2), - ASPEED_PINCTRL_GROUP(SDA1), - ASPEED_PINCTRL_GROUP(SDA2), -+ ASPEED_PINCTRL_GROUP(SGPM), - ASPEED_PINCTRL_GROUP(SGPS1), - ASPEED_PINCTRL_GROUP(SGPS2), - ASPEED_PINCTRL_GROUP(SIOONCTRL), -@@ -2318,6 +2321,7 @@ static const struct aspeed_pin_function aspeed_g5_functions[] = { - ASPEED_PINCTRL_FUNC(SD2), - ASPEED_PINCTRL_FUNC(SDA1), - ASPEED_PINCTRL_FUNC(SDA2), -+ ASPEED_PINCTRL_FUNC(SGPM), - ASPEED_PINCTRL_FUNC(SGPS1), - ASPEED_PINCTRL_FUNC(SGPS2), - ASPEED_PINCTRL_FUNC(SIOONCTRL), -- 2.7.4 diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0010-Update-PECI-drivers-to-sync-with-linux-upstreaming-v.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0018-Update-PECI-drivers-to-sync-with-linux-upstreaming-v.patch index 329a92cd6..77e413125 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0010-Update-PECI-drivers-to-sync-with-linux-upstreaming-v.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0018-Update-PECI-drivers-to-sync-with-linux-upstreaming-v.patch @@ -1,4 +1,4 @@ -From 691b8580a1592eddb919e8dd295e6c1f136a4c00 Mon Sep 17 00:00:00 2001 +From edeea958f026102ce28c8b760f7a96b9ffd7f65a Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo <jae.hyun.yoo@intel.com> Date: Mon, 7 Jan 2019 09:56:10 -0800 Subject: [PATCH] Update PECI drivers to sync with linux upstreaming version @@ -7,10 +7,11 @@ Upstreaming is in holding. It's for adding DTS sensor with PECI subsystem code update. Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> +Signed-off-by: Jason M. Bills <jason.m.bills@linux.intel.com> --- Documentation/hwmon/peci-cputemp | 34 +- drivers/hwmon/Kconfig | 4 +- - drivers/hwmon/peci-cputemp.c | 171 ++++--- + drivers/hwmon/peci-cputemp.c | 171 +++--- drivers/hwmon/peci-dimmtemp.c | 184 +++++-- drivers/hwmon/peci-hwmon.h | 9 +- drivers/mfd/Kconfig | 5 +- @@ -19,16 +20,16 @@ Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> drivers/peci/Makefile | 7 +- drivers/peci/busses/Kconfig | 32 ++ drivers/peci/busses/Makefile | 7 + - drivers/peci/busses/peci-aspeed.c | 492 ++++++++++++++++++ + drivers/peci/busses/peci-aspeed.c | 492 +++++++++++++++++ drivers/peci/busses/peci-npcm.c | 410 +++++++++++++++ - drivers/peci/peci-aspeed.c | 505 ------------------- - drivers/peci/peci-core.c | 914 ++++++++++++++++++---------------- - drivers/peci/peci-dev.c | 346 +++++++++++++ + drivers/peci/peci-aspeed.c | 505 ------------------ + drivers/peci/peci-core.c | 959 +++++++++++++++++++--------------- + drivers/peci/peci-dev.c | 346 ++++++++++++ drivers/peci/peci-npcm.c | 410 --------------- include/linux/mfd/intel-peci-client.h | 31 +- include/linux/peci.h | 30 +- - include/uapi/linux/peci-ioctl.h | 416 +++++++++------- - 20 files changed, 2402 insertions(+), 1702 deletions(-) + include/uapi/linux/peci-ioctl.h | 416 +++++++++------ + 20 files changed, 2446 insertions(+), 1703 deletions(-) create mode 100644 drivers/peci/busses/Kconfig create mode 100644 drivers/peci/busses/Makefile create mode 100644 drivers/peci/busses/peci-aspeed.c @@ -38,7 +39,7 @@ Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> delete mode 100644 drivers/peci/peci-npcm.c diff --git a/Documentation/hwmon/peci-cputemp b/Documentation/hwmon/peci-cputemp -index 821a9258f2e6..a3a3e465c888 100644 +index 821a925..a3a3e46 100644 --- a/Documentation/hwmon/peci-cputemp +++ b/Documentation/hwmon/peci-cputemp @@ -51,28 +51,38 @@ temp1_crit Provides shutdown temperature of the CPU package which @@ -93,7 +94,7 @@ index 821a9258f2e6..a3a3e465c888 100644 +temp[6-*]_crit_hyst Provides the hysteresis value from Tcontrol to Tjmax of the core. diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig -index c0623fa5ba41..7399c3cef30c 100644 +index c0623fa..7399c3c 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig @@ -1333,7 +1333,7 @@ config SENSORS_PECI_CPUTEMP @@ -115,7 +116,7 @@ index c0623fa5ba41..7399c3cef30c 100644 source "drivers/hwmon/pmbus/Kconfig" diff --git a/drivers/hwmon/peci-cputemp.c b/drivers/hwmon/peci-cputemp.c -index 11880c86a854..d0d68e88889f 100644 +index 11880c8..d0d68e8 100644 --- a/drivers/hwmon/peci-cputemp.c +++ b/drivers/hwmon/peci-cputemp.c @@ -1,5 +1,5 @@ @@ -477,7 +478,7 @@ index 11880c86a854..d0d68e88889f 100644 module_platform_driver(peci_cputemp_driver); diff --git a/drivers/hwmon/peci-dimmtemp.c b/drivers/hwmon/peci-dimmtemp.c -index 86a45a90805b..a404b6ea4ba3 100644 +index 86a45a9..a404b6e 100644 --- a/drivers/hwmon/peci-dimmtemp.c +++ b/drivers/hwmon/peci-dimmtemp.c @@ -1,5 +1,5 @@ @@ -795,7 +796,7 @@ index 86a45a90805b..a404b6ea4ba3 100644 module_platform_driver(peci_dimmtemp_driver); diff --git a/drivers/hwmon/peci-hwmon.h b/drivers/hwmon/peci-hwmon.h -index 6ca1855a86bb..ce6b470eae63 100644 +index 6ca1855..ce6b470 100644 --- a/drivers/hwmon/peci-hwmon.h +++ b/drivers/hwmon/peci-hwmon.h @@ -1,5 +1,5 @@ @@ -820,10 +821,10 @@ index 6ca1855a86bb..ce6b470eae63 100644 /** diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig -index 75dbcc7da87c..6f7ee4dd08f6 100644 +index 5d89546..46f52a3 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig -@@ -616,7 +616,7 @@ config MFD_INTEL_MSIC +@@ -630,7 +630,7 @@ config MFD_INTEL_MSIC devices used in Intel Medfield platforms. config MFD_INTEL_PECI_CLIENT @@ -832,7 +833,7 @@ index 75dbcc7da87c..6f7ee4dd08f6 100644 depends on (PECI || COMPILE_TEST) select MFD_CORE help -@@ -629,6 +629,9 @@ config MFD_INTEL_PECI_CLIENT +@@ -643,6 +643,9 @@ config MFD_INTEL_PECI_CLIENT Additional drivers must be enabled in order to use the functionality of the device. @@ -843,7 +844,7 @@ index 75dbcc7da87c..6f7ee4dd08f6 100644 bool "Atmel Micro ASIC (iPAQ h3100/h3600/h3700) Support" depends on SA1100_H3100 || SA1100_H3600 diff --git a/drivers/mfd/intel-peci-client.c b/drivers/mfd/intel-peci-client.c -index d53e4f1078ac..18bf0af0e09e 100644 +index d53e4f1..18bf0af 100644 --- a/drivers/mfd/intel-peci-client.c +++ b/drivers/mfd/intel-peci-client.c @@ -1,12 +1,12 @@ @@ -989,7 +990,7 @@ index d53e4f1078ac..18bf0af0e09e 100644 }, }; diff --git a/drivers/peci/Kconfig b/drivers/peci/Kconfig -index 7293108fb543..9752feee2454 100644 +index 7293108..9752fee 100644 --- a/drivers/peci/Kconfig +++ b/drivers/peci/Kconfig @@ -2,10 +2,12 @@ @@ -1059,7 +1060,7 @@ index 7293108fb543..9752feee2454 100644 + +endmenu diff --git a/drivers/peci/Makefile b/drivers/peci/Makefile -index 3326da54a21a..da8b0a33fa42 100644 +index 3326da5..da8b0a3 100644 --- a/drivers/peci/Makefile +++ b/drivers/peci/Makefile @@ -1,10 +1,11 @@ @@ -1079,7 +1080,7 @@ index 3326da54a21a..da8b0a33fa42 100644 +obj-y += busses/ diff --git a/drivers/peci/busses/Kconfig b/drivers/peci/busses/Kconfig new file mode 100644 -index 000000000000..bfacafb7a7ba +index 0000000..bfacafb --- /dev/null +++ b/drivers/peci/busses/Kconfig @@ -0,0 +1,32 @@ @@ -1117,7 +1118,7 @@ index 000000000000..bfacafb7a7ba +endmenu diff --git a/drivers/peci/busses/Makefile b/drivers/peci/busses/Makefile new file mode 100644 -index 000000000000..aa8ce3ae5947 +index 0000000..aa8ce3a --- /dev/null +++ b/drivers/peci/busses/Makefile @@ -0,0 +1,7 @@ @@ -1130,7 +1131,7 @@ index 000000000000..aa8ce3ae5947 +obj-$(CONFIG_PECI_NPCM) += peci-npcm.o diff --git a/drivers/peci/busses/peci-aspeed.c b/drivers/peci/busses/peci-aspeed.c new file mode 100644 -index 000000000000..851b71e32eac +index 0000000..851b71e3 --- /dev/null +++ b/drivers/peci/busses/peci-aspeed.c @@ -0,0 +1,492 @@ @@ -1628,7 +1629,7 @@ index 000000000000..851b71e32eac +MODULE_LICENSE("GPL v2"); diff --git a/drivers/peci/busses/peci-npcm.c b/drivers/peci/busses/peci-npcm.c new file mode 100644 -index 000000000000..f632365b1416 +index 0000000..f632365 --- /dev/null +++ b/drivers/peci/busses/peci-npcm.c @@ -0,0 +1,410 @@ @@ -2044,7 +2045,7 @@ index 000000000000..f632365b1416 +MODULE_LICENSE("GPL v2"); diff --git a/drivers/peci/peci-aspeed.c b/drivers/peci/peci-aspeed.c deleted file mode 100644 -index 51cb2563ceb6..000000000000 +index 51cb256..0000000 --- a/drivers/peci/peci-aspeed.c +++ /dev/null @@ -1,505 +0,0 @@ @@ -2554,7 +2555,7 @@ index 51cb2563ceb6..000000000000 -MODULE_DESCRIPTION("ASPEED PECI driver"); -MODULE_LICENSE("GPL v2"); diff --git a/drivers/peci/peci-core.c b/drivers/peci/peci-core.c -index 6f241469ec7e..48f29de09311 100644 +index 6f24146..2a6be04 100644 --- a/drivers/peci/peci-core.c +++ b/drivers/peci/peci-core.c @@ -1,38 +1,31 @@ @@ -2654,8 +2655,7 @@ index 6f241469ec7e..48f29de09311 100644 + * This function must only be called from process context! + */ +struct peci_xfer_msg *peci_get_xfer_msg(u8 tx_len, u8 rx_len) - { -- return crc8(peci_crc8_table, data, (size_t)len, 0); ++{ + struct peci_xfer_msg *msg; + u8 *tx_buf, *rx_buf; + @@ -2712,7 +2712,8 @@ index 6f241469ec7e..48f29de09311 100644 + +/* Calculate an Assured Write Frame Check Sequence byte */ +static int peci_aw_fcs(struct peci_xfer_msg *msg, int len, u8 *aw_fcs) -+{ + { +- return crc8(peci_crc8_table, data, (size_t)len, 0); + u8 *tmp_buf; + + /* Allocate a temporary buffer to use a contiguous byte array */ @@ -2804,11 +2805,11 @@ index 6f241469ec7e..48f29de09311 100644 + ret = peci_aw_fcs(msg, 2 + msg->tx_len, &aw_fcs); + if (ret) + break; -+ -+ msg->tx_buf[msg->tx_len - 1] = 0x80 ^ aw_fcs; -+ } - /** ++ msg->tx_buf[msg->tx_len - 1] = 0x80 ^ aw_fcs; ++ } ++ + /* * Retry for at least 250ms before returning an error. * Retry interval guideline: @@ -2910,7 +2911,7 @@ index 6f241469ec7e..48f29de09311 100644 { if (!(adapter->cmd_mask & BIT(PECI_CMD_PING)) && peci_scan_cmd_mask(adapter) < 0) { -@@ -262,70 +363,87 @@ static int peci_cmd_support(struct peci_adapter *adapter, enum peci_cmd cmd) +@@ -262,70 +363,130 @@ static int peci_cmd_support(struct peci_adapter *adapter, enum peci_cmd cmd) return 0; } @@ -2918,8 +2919,52 @@ index 6f241469ec7e..48f29de09311 100644 +static int peci_cmd_xfer(struct peci_adapter *adapter, void *vmsg) { struct peci_xfer_msg *msg = vmsg; ++ u8 aw_fcs; ++ int ret; ++ ++ if (!msg->tx_len) { ++ ret = peci_xfer(adapter, msg); ++ } else { ++ switch (msg->tx_buf[0]) { ++ case PECI_RDPKGCFG_CMD: ++ case PECI_RDIAMSR_CMD: ++ case PECI_RDPCICFG_CMD: ++ case PECI_RDPCICFGLOCAL_CMD: ++ ret = peci_xfer_with_retries(adapter, msg, false); ++ break; ++ case PECI_WRPKGCFG_CMD: ++ case PECI_WRIAMSR_CMD: ++ case PECI_WRPCICFG_CMD: ++ case PECI_WRPCICFGLOCAL_CMD: ++ /* Check if the AW FCS byte is already provided */ ++ ret = peci_aw_fcs(msg, 2 + msg->tx_len, &aw_fcs); ++ if (ret) ++ break; ++ ++ if (msg->tx_buf[msg->tx_len - 1] != (0x80 ^ aw_fcs)) { ++ /* Add an Assured Write Frame Check Sequence byte */ ++ /* Increment the tx_len to include the new byte */ ++ msg->tx_len++; ++ ret = peci_aw_fcs(msg, 2 + msg->tx_len, ++ &aw_fcs); ++ if (ret) ++ break; ++ ++ msg->tx_buf[msg->tx_len - 1] = 0x80 ^ aw_fcs; ++ } ++ ++ ret = peci_xfer_with_retries(adapter, msg, true); ++ break; ++ case PECI_GET_DIB_CMD: ++ case PECI_GET_TEMP_CMD: ++ default: ++ ret = peci_xfer(adapter, msg); ++ break; ++ } ++ } - return peci_xfer(adapter, msg); +- return peci_xfer(adapter, msg); ++ return ret; } -static int peci_ioctl_ping(struct peci_adapter *adapter, void *vmsg) @@ -2933,15 +2978,15 @@ index 6f241469ec7e..48f29de09311 100644 + msg = peci_get_xfer_msg(0, 0); + if (!msg) + return -ENOMEM; -+ -+ msg->addr = umsg->addr; - msg.addr = umsg->addr; - msg.tx_len = 0; - msg.rx_len = 0; -+ ret = peci_xfer(adapter, msg); ++ msg->addr = umsg->addr; - return peci_xfer(adapter, &msg); ++ ret = peci_xfer(adapter, msg); ++ + peci_put_xfer_msg(msg); + + return ret; @@ -3032,7 +3077,7 @@ index 6f241469ec7e..48f29de09311 100644 /* Per the PECI spec, the read length must be a byte, word, or dword */ if (umsg->rx_len != 1 && umsg->rx_len != 2 && umsg->rx_len != 4) { -@@ -334,29 +452,35 @@ static int peci_ioctl_rd_pkg_cfg(struct peci_adapter *adapter, void *vmsg) +@@ -334,29 +495,35 @@ static int peci_ioctl_rd_pkg_cfg(struct peci_adapter *adapter, void *vmsg) return -EINVAL; } @@ -3058,18 +3103,18 @@ index 6f241469ec7e..48f29de09311 100644 + msg->tx_buf[2] = umsg->index; /* RdPkgConfig index */ + msg->tx_buf[3] = (u8)umsg->param; /* LSB - Config parameter */ + msg->tx_buf[4] = (u8)(umsg->param >> 8); /* MSB - Config parameter */ - -- rc = peci_xfer_with_retries(adapter, &msg, false); -- if (!rc) -- memcpy(umsg->pkg_config, &msg.rx_buf[1], umsg->rx_len); ++ + ret = peci_xfer_with_retries(adapter, msg, false); + if (!ret) + memcpy(umsg->pkg_config, &msg->rx_buf[1], umsg->rx_len); -- return rc; +- rc = peci_xfer_with_retries(adapter, &msg, false); +- if (!rc) +- memcpy(umsg->pkg_config, &msg.rx_buf[1], umsg->rx_len); + umsg->cc = msg->rx_buf[0]; + peci_put_xfer_msg(msg); -+ + +- return rc; + return ret; } @@ -3085,7 +3130,7 @@ index 6f241469ec7e..48f29de09311 100644 /* Per the PECI spec, the write length must be a dword */ if (umsg->tx_len != 4) { -@@ -365,86 +489,116 @@ static int peci_ioctl_wr_pkg_cfg(struct peci_adapter *adapter, void *vmsg) +@@ -365,86 +532,116 @@ static int peci_ioctl_wr_pkg_cfg(struct peci_adapter *adapter, void *vmsg) return -EINVAL; } @@ -3118,20 +3163,20 @@ index 6f241469ec7e..48f29de09311 100644 + ret = peci_aw_fcs(msg, 8 + umsg->tx_len, &aw_fcs); + if (ret) + goto out; ++ ++ msg->tx_buf[5 + i] = 0x80 ^ aw_fcs; - /* Add an Assure Write Frame Check Sequence byte */ - msg.tx_buf[5 + i] = 0x80 ^ - peci_aw_fcs((u8 *)&msg, 8 + umsg->tx_len); -+ msg->tx_buf[5 + i] = 0x80 ^ aw_fcs; - -- rc = peci_xfer_with_retries(adapter, &msg, true); + ret = peci_xfer_with_retries(adapter, msg, true); -- return rc; +- rc = peci_xfer_with_retries(adapter, &msg, true); +out: + umsg->cc = msg->rx_buf[0]; + peci_put_xfer_msg(msg); -+ + +- return rc; + return ret; } @@ -3226,23 +3271,23 @@ index 6f241469ec7e..48f29de09311 100644 + ret = peci_xfer_with_retries(adapter, msg, false); + if (!ret) + memcpy(umsg->pci_config, &msg->rx_buf[1], 4); ++ ++ umsg->cc = msg->rx_buf[0]; ++ peci_put_xfer_msg(msg); - rc = peci_xfer_with_retries(adapter, &msg, false); - if (!rc) - memcpy(umsg->pci_config, &msg.rx_buf[1], 4); -+ umsg->cc = msg->rx_buf[0]; -+ peci_put_xfer_msg(msg); - -- return rc; + return ret; - } ++} --static int peci_ioctl_rd_pci_cfg_local(struct peci_adapter *adapter, void *vmsg) +- return rc; +static int peci_cmd_wr_pci_cfg(struct peci_adapter *adapter, void *vmsg) +{ + return -ENOSYS; /* Not implemented yet */ -+} -+ + } + +-static int peci_ioctl_rd_pci_cfg_local(struct peci_adapter *adapter, void *vmsg) +static int peci_cmd_rd_pci_cfg_local(struct peci_adapter *adapter, void *vmsg) { struct peci_rd_pci_cfg_local_msg *umsg = vmsg; @@ -3254,7 +3299,7 @@ index 6f241469ec7e..48f29de09311 100644 /* Per the PECI spec, the read length must be a byte, word, or dword */ if (umsg->rx_len != 1 && umsg->rx_len != 2 && umsg->rx_len != 4) { -@@ -453,34 +607,42 @@ static int peci_ioctl_rd_pci_cfg_local(struct peci_adapter *adapter, void *vmsg) +@@ -453,34 +650,42 @@ static int peci_ioctl_rd_pci_cfg_local(struct peci_adapter *adapter, void *vmsg) return -EINVAL; } @@ -3313,7 +3358,7 @@ index 6f241469ec7e..48f29de09311 100644 /* Per the PECI spec, the write length must be a byte, word, or dword */ if (umsg->tx_len != 1 && umsg->tx_len != 2 && umsg->tx_len != 4) { -@@ -489,47 +651,57 @@ static int peci_ioctl_wr_pci_cfg_local(struct peci_adapter *adapter, void *vmsg) +@@ -489,47 +694,57 @@ static int peci_ioctl_wr_pci_cfg_local(struct peci_adapter *adapter, void *vmsg) return -EINVAL; } @@ -3351,20 +3396,20 @@ index 6f241469ec7e..48f29de09311 100644 + ret = peci_aw_fcs(msg, 8 + umsg->tx_len, &aw_fcs); + if (ret) + goto out; -+ -+ msg->tx_buf[5 + i] = 0x80 ^ aw_fcs; - /* Add an Assure Write Frame Check Sequence byte */ - msg.tx_buf[5 + i] = 0x80 ^ - peci_aw_fcs((u8 *)&msg, 8 + umsg->tx_len); -+ ret = peci_xfer_with_retries(adapter, msg, true); ++ msg->tx_buf[5 + i] = 0x80 ^ aw_fcs; - rc = peci_xfer_with_retries(adapter, &msg, true); ++ ret = peci_xfer_with_retries(adapter, msg, true); + +- return rc; +out: + umsg->cc = msg->rx_buf[0]; + peci_put_xfer_msg(msg); - -- return rc; ++ + return ret; } @@ -3401,7 +3446,7 @@ index 6f241469ec7e..48f29de09311 100644 }; /** -@@ -545,109 +717,28 @@ static const peci_ioctl_fn_type peci_ioctl_fn[PECI_CMD_MAX] = { +@@ -545,109 +760,28 @@ static const peci_ioctl_fn_type peci_ioctl_fn[PECI_CMD_MAX] = { */ int peci_command(struct peci_adapter *adapter, enum peci_cmd cmd, void *vmsg) { @@ -3520,7 +3565,7 @@ index 6f241469ec7e..48f29de09311 100644 static int peci_detect(struct peci_adapter *adapter, u8 addr) { struct peci_ping_msg msg; -@@ -666,9 +757,9 @@ peci_of_match_device(const struct of_device_id *matches, +@@ -666,9 +800,9 @@ peci_of_match_device(const struct of_device_id *matches, return NULL; return of_match_device(matches, &client->dev); @@ -3532,7 +3577,7 @@ index 6f241469ec7e..48f29de09311 100644 } static const struct peci_device_id * -@@ -737,6 +828,7 @@ static int peci_device_probe(struct device *dev) +@@ -737,6 +871,7 @@ static int peci_device_probe(struct device *dev) err_detach_pm_domain: dev_pm_domain_detach(&client->dev, true); @@ -3540,7 +3585,7 @@ index 6f241469ec7e..48f29de09311 100644 return status; } -@@ -775,13 +867,14 @@ static void peci_device_shutdown(struct device *dev) +@@ -775,13 +910,14 @@ static void peci_device_shutdown(struct device *dev) driver->shutdown(client); } @@ -3556,7 +3601,7 @@ index 6f241469ec7e..48f29de09311 100644 static int peci_check_addr_validity(u8 addr) { -@@ -814,18 +907,22 @@ static int peci_check_client_busy(struct device *dev, void *client_new_p) +@@ -814,18 +950,22 @@ static int peci_check_client_busy(struct device *dev, void *client_new_p) int peci_get_cpu_id(struct peci_adapter *adapter, u8 addr, u32 *cpu_id) { struct peci_rd_pkg_cfg_msg msg; @@ -3586,7 +3631,7 @@ index 6f241469ec7e..48f29de09311 100644 } EXPORT_SYMBOL_GPL(peci_get_cpu_id); -@@ -833,7 +930,7 @@ static struct peci_client *peci_new_device(struct peci_adapter *adapter, +@@ -833,7 +973,7 @@ static struct peci_client *peci_new_device(struct peci_adapter *adapter, struct peci_board_info const *info) { struct peci_client *client; @@ -3595,7 +3640,7 @@ index 6f241469ec7e..48f29de09311 100644 /* Increase reference count for the adapter assigned */ if (!peci_get_adapter(adapter->nr)) -@@ -847,46 +944,49 @@ static struct peci_client *peci_new_device(struct peci_adapter *adapter, +@@ -847,46 +987,49 @@ static struct peci_client *peci_new_device(struct peci_adapter *adapter, client->addr = info->addr; strlcpy(client->name, info->type, sizeof(client->name)); @@ -3657,7 +3702,7 @@ index 6f241469ec7e..48f29de09311 100644 return NULL; } -@@ -895,8 +995,10 @@ static void peci_unregister_device(struct peci_client *client) +@@ -895,8 +1038,10 @@ static void peci_unregister_device(struct peci_client *client) if (!client) return; @@ -3669,7 +3714,7 @@ index 6f241469ec7e..48f29de09311 100644 device_unregister(&client->dev); } -@@ -916,7 +1018,7 @@ static void peci_adapter_dev_release(struct device *dev) +@@ -916,7 +1061,7 @@ static void peci_adapter_dev_release(struct device *dev) dev_dbg(dev, "%s: %s\n", __func__, adapter->name); mutex_destroy(&adapter->userspace_clients_lock); @@ -3678,7 +3723,7 @@ index 6f241469ec7e..48f29de09311 100644 kfree(adapter); } -@@ -928,7 +1030,8 @@ static ssize_t peci_sysfs_new_device(struct device *dev, +@@ -928,7 +1073,8 @@ static ssize_t peci_sysfs_new_device(struct device *dev, struct peci_board_info info = {}; struct peci_client *client; char *blank, end; @@ -3688,7 +3733,7 @@ index 6f241469ec7e..48f29de09311 100644 /* Parse device type */ blank = strchr(buf, ' '); -@@ -943,16 +1046,17 @@ static ssize_t peci_sysfs_new_device(struct device *dev, +@@ -943,16 +1089,17 @@ static ssize_t peci_sysfs_new_device(struct device *dev, memcpy(info.type, buf, blank - buf); /* Parse remaining parameters, reject extra parameters */ @@ -3709,7 +3754,7 @@ index 6f241469ec7e..48f29de09311 100644 client = peci_new_device(adapter, &info); if (!client) return -EINVAL; -@@ -961,8 +1065,8 @@ static ssize_t peci_sysfs_new_device(struct device *dev, +@@ -961,8 +1108,8 @@ static ssize_t peci_sysfs_new_device(struct device *dev, mutex_lock(&adapter->userspace_clients_lock); list_add_tail(&client->detected, &adapter->userspace_clients); mutex_unlock(&adapter->userspace_clients_lock); @@ -3720,7 +3765,7 @@ index 6f241469ec7e..48f29de09311 100644 return count; } -@@ -975,9 +1079,9 @@ static ssize_t peci_sysfs_delete_device(struct device *dev, +@@ -975,9 +1122,9 @@ static ssize_t peci_sysfs_delete_device(struct device *dev, struct peci_adapter *adapter = to_peci_adapter(dev); struct peci_client *client, *next; struct peci_board_info info = {}; @@ -3732,7 +3777,7 @@ index 6f241469ec7e..48f29de09311 100644 /* Parse device type */ blank = strchr(buf, ' '); -@@ -992,41 +1096,41 @@ static ssize_t peci_sysfs_delete_device(struct device *dev, +@@ -992,41 +1139,41 @@ static ssize_t peci_sysfs_delete_device(struct device *dev, memcpy(info.type, buf, blank - buf); /* Parse remaining parameters, reject extra parameters */ @@ -3786,7 +3831,7 @@ index 6f241469ec7e..48f29de09311 100644 } static DEVICE_ATTR_IGNORE_LOCKDEP(delete_device, 0200, NULL, peci_sysfs_delete_device); -@@ -1039,10 +1143,11 @@ static struct attribute *peci_adapter_attrs[] = { +@@ -1039,10 +1186,11 @@ static struct attribute *peci_adapter_attrs[] = { }; ATTRIBUTE_GROUPS(peci_adapter); @@ -3799,7 +3844,7 @@ index 6f241469ec7e..48f29de09311 100644 /** * peci_verify_adapter - return parameter as peci_adapter, or NULL -@@ -1063,32 +1168,26 @@ static struct peci_client *peci_of_register_device(struct peci_adapter *adapter, +@@ -1063,32 +1211,26 @@ static struct peci_client *peci_of_register_device(struct peci_adapter *adapter, struct device_node *node) { struct peci_board_info info = {}; @@ -3844,7 +3889,7 @@ index 6f241469ec7e..48f29de09311 100644 } static void peci_of_register_devices(struct peci_adapter *adapter) -@@ -1119,7 +1218,7 @@ static void peci_of_register_devices(struct peci_adapter *adapter) +@@ -1119,7 +1261,7 @@ static void peci_of_register_devices(struct peci_adapter *adapter) of_node_put(bus); } @@ -3853,7 +3898,7 @@ index 6f241469ec7e..48f29de09311 100644 static void peci_of_register_devices(struct peci_adapter *adapter) { } #endif /* CONFIG_OF */ -@@ -1163,9 +1262,7 @@ static struct peci_adapter *peci_of_find_adapter(struct device_node *node) +@@ -1163,9 +1305,7 @@ static struct peci_adapter *peci_of_find_adapter(struct device_node *node) return adapter; } @@ -3864,7 +3909,7 @@ index 6f241469ec7e..48f29de09311 100644 { struct of_reconfig_data *rd = arg; struct peci_adapter *adapter; -@@ -1216,7 +1313,7 @@ static int peci_of_notify(struct notifier_block *nb, +@@ -1216,7 +1356,7 @@ static int peci_of_notify(struct notifier_block *nb, static struct notifier_block peci_of_notifier = { .notifier_call = peci_of_notify, }; @@ -3873,7 +3918,7 @@ index 6f241469ec7e..48f29de09311 100644 extern struct notifier_block peci_of_notifier; #endif /* CONFIG_OF_DYNAMIC */ -@@ -1240,7 +1337,7 @@ extern struct notifier_block peci_of_notifier; +@@ -1240,7 +1380,7 @@ extern struct notifier_block peci_of_notifier; * * Return: the peci_adapter structure on success, else NULL. */ @@ -3882,7 +3927,7 @@ index 6f241469ec7e..48f29de09311 100644 { struct peci_adapter *adapter; -@@ -1263,7 +1360,7 @@ EXPORT_SYMBOL_GPL(peci_alloc_adapter); +@@ -1263,7 +1403,7 @@ EXPORT_SYMBOL_GPL(peci_alloc_adapter); static int peci_register_adapter(struct peci_adapter *adapter) { @@ -3891,7 +3936,7 @@ index 6f241469ec7e..48f29de09311 100644 /* Can't register until after driver model init */ if (WARN_ON(!is_registered)) -@@ -1275,27 +1372,17 @@ static int peci_register_adapter(struct peci_adapter *adapter) +@@ -1275,27 +1415,17 @@ static int peci_register_adapter(struct peci_adapter *adapter) if (WARN(!adapter->xfer, "peci adapter has no xfer function\n")) goto err_free_idr; @@ -3924,7 +3969,7 @@ index 6f241469ec7e..48f29de09311 100644 } dev_dbg(&adapter->dev, "adapter [%s] registered\n", adapter->name); -@@ -1309,13 +1396,11 @@ static int peci_register_adapter(struct peci_adapter *adapter) +@@ -1309,13 +1439,11 @@ static int peci_register_adapter(struct peci_adapter *adapter) return 0; @@ -3939,7 +3984,7 @@ index 6f241469ec7e..48f29de09311 100644 } static int peci_add_numbered_adapter(struct peci_adapter *adapter) -@@ -1354,12 +1439,10 @@ int peci_add_adapter(struct peci_adapter *adapter) +@@ -1354,12 +1482,10 @@ int peci_add_adapter(struct peci_adapter *adapter) struct device *dev = &adapter->dev; int id; @@ -3956,7 +4001,7 @@ index 6f241469ec7e..48f29de09311 100644 } mutex_lock(&core_lock); -@@ -1411,7 +1494,7 @@ void peci_del_adapter(struct peci_adapter *adapter) +@@ -1411,7 +1537,7 @@ void peci_del_adapter(struct peci_adapter *adapter) } mutex_unlock(&adapter->userspace_clients_lock); @@ -3965,7 +4010,7 @@ index 6f241469ec7e..48f29de09311 100644 * Detach any active clients. This can't fail, thus we do not * check the returned value. */ -@@ -1420,13 +1503,8 @@ void peci_del_adapter(struct peci_adapter *adapter) +@@ -1420,13 +1546,8 @@ void peci_del_adapter(struct peci_adapter *adapter) /* device name is gone after device_unregister */ dev_dbg(&adapter->dev, "adapter [%s] unregistered\n", adapter->name); @@ -3979,7 +4024,7 @@ index 6f241469ec7e..48f29de09311 100644 device_unregister(&adapter->dev); /* free bus id */ -@@ -1436,6 +1514,18 @@ void peci_del_adapter(struct peci_adapter *adapter) +@@ -1436,6 +1557,18 @@ void peci_del_adapter(struct peci_adapter *adapter) } EXPORT_SYMBOL_GPL(peci_del_adapter); @@ -3998,7 +4043,7 @@ index 6f241469ec7e..48f29de09311 100644 /** * peci_register_driver - register a PECI driver * @owner: owner module of the driver being registered -@@ -1446,7 +1536,7 @@ EXPORT_SYMBOL_GPL(peci_del_adapter); +@@ -1446,7 +1579,7 @@ EXPORT_SYMBOL_GPL(peci_del_adapter); */ int peci_register_driver(struct module *owner, struct peci_driver *driver) { @@ -4007,7 +4052,7 @@ index 6f241469ec7e..48f29de09311 100644 /* Can't register until after driver model init */ if (WARN_ON(!is_registered)) -@@ -1456,13 +1546,13 @@ int peci_register_driver(struct module *owner, struct peci_driver *driver) +@@ -1456,13 +1589,13 @@ int peci_register_driver(struct module *owner, struct peci_driver *driver) driver->driver.owner = owner; driver->driver.bus = &peci_bus_type; @@ -4025,7 +4070,7 @@ index 6f241469ec7e..48f29de09311 100644 pr_debug("driver [%s] registered\n", driver->driver.name); -@@ -1492,13 +1582,6 @@ static int __init peci_init(void) +@@ -1492,13 +1625,6 @@ static int __init peci_init(void) return ret; } @@ -4039,7 +4084,7 @@ index 6f241469ec7e..48f29de09311 100644 crc8_populate_msb(peci_crc8_table, PECI_CRC8_POLYNOMIAL); if (IS_ENABLED(CONFIG_OF_DYNAMIC)) -@@ -1514,11 +1597,10 @@ static void __exit peci_exit(void) +@@ -1514,11 +1640,10 @@ static void __exit peci_exit(void) if (IS_ENABLED(CONFIG_OF_DYNAMIC)) WARN_ON(of_reconfig_notifier_unregister(&peci_of_notifier)); @@ -4054,7 +4099,7 @@ index 6f241469ec7e..48f29de09311 100644 MODULE_AUTHOR("Jason M Biils <jason.m.bills@linux.intel.com>"); diff --git a/drivers/peci/peci-dev.c b/drivers/peci/peci-dev.c new file mode 100644 -index 000000000000..ac9cba0fb429 +index 0000000..ac9cba0 --- /dev/null +++ b/drivers/peci/peci-dev.c @@ -0,0 +1,346 @@ @@ -4406,7 +4451,7 @@ index 000000000000..ac9cba0fb429 +MODULE_LICENSE("GPL v2"); diff --git a/drivers/peci/peci-npcm.c b/drivers/peci/peci-npcm.c deleted file mode 100644 -index f632365b1416..000000000000 +index f632365..0000000 --- a/drivers/peci/peci-npcm.c +++ /dev/null @@ -1,410 +0,0 @@ @@ -4821,7 +4866,7 @@ index f632365b1416..000000000000 -MODULE_DESCRIPTION("NPCM Platform Environment Control Interface (PECI) driver"); -MODULE_LICENSE("GPL v2"); diff --git a/include/linux/mfd/intel-peci-client.h b/include/linux/mfd/intel-peci-client.h -index 8f6d823a59cd..9854303bbc26 100644 +index 8f6d823..9854303 100644 --- a/include/linux/mfd/intel-peci-client.h +++ b/include/linux/mfd/intel-peci-client.h @@ -1,5 +1,5 @@ @@ -4907,7 +4952,7 @@ index 8f6d823a59cd..9854303bbc26 100644 #endif /* __LINUX_MFD_INTEL_PECI_CLIENT_H */ diff --git a/include/linux/peci.h b/include/linux/peci.h -index d0e47d45d1d0..6fc424dc2a73 100644 +index d0e47d4..6fc424d 100644 --- a/include/linux/peci.h +++ b/include/linux/peci.h @@ -1,19 +1,18 @@ @@ -5003,7 +5048,7 @@ index d0e47d45d1d0..6fc424dc2a73 100644 int peci_get_cpu_id(struct peci_adapter *adapter, u8 addr, u32 *cpu_id); diff --git a/include/uapi/linux/peci-ioctl.h b/include/uapi/linux/peci-ioctl.h -index a6dae71cbff5..253fb42e38b7 100644 +index a6dae71..253fb42 100644 --- a/include/uapi/linux/peci-ioctl.h +++ b/include/uapi/linux/peci-ioctl.h @@ -1,5 +1,5 @@ diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0020-misc-aspeed-add-lpc-mbox-driver.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0020-misc-aspeed-add-lpc-mbox-driver.patch index 884a7018c..a444d39b3 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0020-misc-aspeed-add-lpc-mbox-driver.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0020-misc-aspeed-add-lpc-mbox-driver.patch @@ -1,4 +1,4 @@ -From efa7ad95db45494b2c3685c0688f00174e517e34 Mon Sep 17 00:00:00 2001 +From c1567ac196f176b19b53b6c4e7949809fd01e334 Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo <jae.hyun.yoo@intel.com> Date: Wed, 10 Jul 2019 16:19:33 -0700 Subject: [PATCH] misc: aspeed: add lpc mbox driver @@ -20,10 +20,10 @@ Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> create mode 100644 drivers/soc/aspeed/aspeed-lpc-mbox.c diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi b/arch/arm/boot/dts/aspeed-g4.dtsi -index 00848693f455..4b8b0be22cd4 100644 +index ee86b41af291..b7b6e8aa3a12 100644 --- a/arch/arm/boot/dts/aspeed-g4.dtsi +++ b/arch/arm/boot/dts/aspeed-g4.dtsi -@@ -344,6 +344,15 @@ +@@ -394,6 +394,15 @@ sio_regs: regs { compatible = "aspeed,bmc-misc"; }; @@ -40,10 +40,10 @@ index 00848693f455..4b8b0be22cd4 100644 }; diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index 8406da6f62a5..9f3bd5bafab5 100644 +index 128e0b5bbae2..12a81155f1ab 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -473,6 +473,15 @@ +@@ -503,6 +503,15 @@ sio_regs: regs { compatible = "aspeed,bmc-misc"; }; diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0021-Initial-Port-of-Aspeed-LPC-SIO-driver.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0021-Initial-Port-of-Aspeed-LPC-SIO-driver.patch index b347894be..24eca1bb9 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0021-Initial-Port-of-Aspeed-LPC-SIO-driver.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0021-Initial-Port-of-Aspeed-LPC-SIO-driver.patch @@ -1,4 +1,4 @@ -From 3d1ddeb903f6eaeb06ddc1d6cfbed6374ef31f36 Mon Sep 17 00:00:00 2001 +From 450b6d6e58ca9954fd4b675da8b6bb25d21c020f Mon Sep 17 00:00:00 2001 From: Yong Li <yong.b.li@intel.com> Date: Mon, 13 Nov 2017 16:29:44 +0800 Subject: [PATCH] Aspeed LPC SIO driver @@ -44,10 +44,10 @@ index 000000000000..c74ea3a4e5ac + status = "disabled"; +}; diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi b/arch/arm/boot/dts/aspeed-g4.dtsi -index 07758c9b900b..3df43f925848 100644 +index b7b6e8aa3a12..71563972d2fe 100644 --- a/arch/arm/boot/dts/aspeed-g4.dtsi +++ b/arch/arm/boot/dts/aspeed-g4.dtsi -@@ -345,6 +345,13 @@ +@@ -395,6 +395,13 @@ compatible = "aspeed,bmc-misc"; }; @@ -62,10 +62,10 @@ index 07758c9b900b..3df43f925848 100644 compatible = "aspeed,ast2400-mbox"; reg = <0x180 0x5c>; diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index 2387e2d1ff9e..2d6f730a7101 100644 +index 12a81155f1ab..88f75736fe48 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -474,6 +474,13 @@ +@@ -504,6 +504,13 @@ compatible = "aspeed,bmc-misc"; }; diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0022-Add-AST2500-eSPI-driver.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0022-Add-AST2500-eSPI-driver.patch index a44667436..07283f54d 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0022-Add-AST2500-eSPI-driver.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0022-Add-AST2500-eSPI-driver.patch @@ -1,4 +1,4 @@ -From 0f0e0a03218f6a7bdcdd78d319959e6bb974502c Mon Sep 17 00:00:00 2001 +From 6e55e28db5eed85b7717aa4fc92c064f11429f6d Mon Sep 17 00:00:00 2001 From: Haiyue Wang <haiyue.wang@linux.intel.com> Date: Sat, 24 Feb 2018 11:12:32 +0800 Subject: [PATCH] eSPI: add ASPEED AST2500 eSPI driver to boot a host with PCH @@ -16,15 +16,20 @@ Also for the host power on / off actions, from BMC side, the following VW 3. OOB_RESET_ACK 4. HOST_RESET_ACK +Also, it provides monitoring interface of PLTRST_N signal through +/dev/espi-pltrstn + Signed-off-by: Haiyue Wang <haiyue.wang@linux.intel.com> +Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> +Signed-off-by: James Feist <james.feist@linux.intel.com> --- - .../devicetree/bindings/misc/aspeed,espi-slave.txt | 19 ++ - Documentation/misc-devices/espi-slave.rst | 118 +++++++ + .../devicetree/bindings/misc/aspeed,espi-slave.txt | 19 + + Documentation/misc-devices/espi-slave.rst | 118 ++++++ arch/arm/boot/dts/aspeed-g5.dtsi | 4 + drivers/misc/Kconfig | 8 + drivers/misc/Makefile | 1 + - drivers/misc/aspeed-espi-slave.c | 353 +++++++++++++++++++++ - 6 files changed, 503 insertions(+) + drivers/misc/aspeed-espi-slave.c | 420 +++++++++++++++++++++ + 6 files changed, 570 insertions(+) create mode 100644 Documentation/devicetree/bindings/misc/aspeed,espi-slave.txt create mode 100644 Documentation/misc-devices/espi-slave.rst create mode 100644 drivers/misc/aspeed-espi-slave.c @@ -179,10 +184,10 @@ index 000000000000..887a69a7130a +- Interface Base Specification (for Client and Server Platforms) +<https://www.intel.com/content/dam/support/us/en/documents/software/chipset-software/327432-004_espi_base_specification_rev1.0.pdf>`_ diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index 2d6f730a7101..0e7f1d2fa08e 100644 +index 88f75736fe48..26671cc4dbd5 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -289,6 +289,7 @@ +@@ -317,6 +317,7 @@ clocks = <&syscon ASPEED_CLK_APB>; interrupt-controller; #interrupt-cells = <2>; @@ -190,7 +195,7 @@ index 2d6f730a7101..0e7f1d2fa08e 100644 }; sgpio: sgpio@1e780200 { -@@ -383,6 +384,9 @@ +@@ -413,6 +414,9 @@ reg = <0x1e6ee000 0x100>; interrupts = <23>; status = "disabled"; @@ -201,10 +206,10 @@ index 2d6f730a7101..0e7f1d2fa08e 100644 lpc: lpc@1e789000 { diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig -index 9d96469fb41c..b6acddaa9421 100644 +index d681b7201f8c..50814caba1d3 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig -@@ -473,6 +473,14 @@ config VEXPRESS_SYSCFG +@@ -455,6 +455,14 @@ config VEXPRESS_SYSCFG bus. System Configuration interface is one of the possible means of generating transactions on this bus. @@ -220,10 +225,10 @@ index 9d96469fb41c..b6acddaa9421 100644 depends on PCI select CRC32 diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile -index e13de4f0798f..f91f66a15484 100644 +index fdd404120ed8..f168e6713440 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile -@@ -54,6 +54,7 @@ obj-$(CONFIG_GENWQE) += genwqe/ +@@ -53,6 +53,7 @@ obj-$(CONFIG_GENWQE) += genwqe/ obj-$(CONFIG_ECHO) += echo/ obj-$(CONFIG_VEXPRESS_SYSCFG) += vexpress-syscfg.o obj-$(CONFIG_CXL_BASE) += cxl/ @@ -233,363 +238,430 @@ index e13de4f0798f..f91f66a15484 100644 obj-y += cardreader/ diff --git a/drivers/misc/aspeed-espi-slave.c b/drivers/misc/aspeed-espi-slave.c new file mode 100644 -index 000000000000..36ae867ca6f9 +index 000000000000..b0fc01692d3a --- /dev/null +++ b/drivers/misc/aspeed-espi-slave.c -@@ -0,0 +1,353 @@ +@@ -0,0 +1,420 @@ +// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2012-2015, ASPEED Technology Inc. -+ * Copyright (c) 2015-2018, Intel Corporation. -+ */ ++// Copyright (c) 2015-2019, Intel Corporation. + -+#include <linux/atomic.h> +#include <linux/clk.h> -+#include <linux/errno.h> ++#include <linux/fs.h> +#include <linux/interrupt.h> +#include <linux/io.h> +#include <linux/miscdevice.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/platform_device.h> -+#include <linux/poll.h> +#include <linux/regmap.h> -+#include <linux/sched.h> -+#include <linux/slab.h> -+#include <linux/timer.h> -+ -+#define DEVICE_NAME "aspeed-espi-slave" -+ -+#define ESPI_CTRL 0x00 -+#define ESPI_CTRL_SW_RESET GENMASK(31, 24) -+#define ESPI_CTRL_OOB_CHRDY BIT(4) -+#define ESPI_ISR 0x08 -+#define ESPI_ISR_HW_RESET BIT(31) -+#define ESPI_ISR_VW_SYS_EVT1 BIT(22) -+#define ESPI_ISR_VW_SYS_EVT BIT(8) -+#define ESPI_IER 0x0C -+#define ESPI_DATA_PORT 0x28 -+#define ESPI_DATA_PORT_ASPEED 0xa8 -+#define ESPI_SYS_IER 0x94 -+#define ESPI_SYS_EVENT 0x98 -+#define ESPI_SYS_INT_T0 0x110 -+#define ESPI_SYS_INT_T1 0x114 -+#define ESPI_SYS_INT_T2 0x118 -+#define ESPI_SYS_ISR 0x11C -+#define ESPI_SYSEVT_HOST_RST_ACK BIT(27) -+#define ESPI_SYSEVT_SLAVE_BOOT_STATUS BIT(23) -+#define ESPI_SYSEVT_SLAVE_BOOT_DONE BIT(20) -+#define ESPI_SYSEVT_OOB_RST_ACK BIT(16) -+#define ESPI_SYSEVT_HOST_RST_WARN BIT(8) -+#define ESPI_SYSEVT_OOB_RST_WARN BIT(6) -+#define ESPI_SYSEVT_PLT_RST_N BIT(5) -+#define ESPI_SYS1_IER 0x100 -+#define ESPI_SYS1_EVENT 0x104 -+#define ESPI_SYS1_INT_T0 0x120 -+#define ESPI_SYS1_INT_T1 0x124 -+#define ESPI_SYS1_INT_T2 0x128 -+#define ESPI_SYS1_ISR 0x12C -+#define ESPI_SYSEVT1_SUS_ACK BIT(20) -+#define ESPI_SYSEVT1_SUS_WARN BIT(0) -+ -+struct aspeed_espi_slave_data { -+ struct regmap *map; -+ struct clk *clk; ++#include <linux/sched/signal.h> ++#include <linux/spinlock.h> ++#include <linux/uaccess.h> ++ ++#define ASPEED_ESPI_CTRL 0x00 ++#define ASPEED_ESPI_CTRL_SW_RESET GENMASK(31, 24) ++#define ASPEED_ESPI_CTRL_OOB_CHRDY BIT(4) ++#define ASPEED_ESPI_INT_STS 0x08 ++#define ASPEED_ESPI_HW_RESET BIT(31) ++#define ASPEED_ESPI_VW_SYSEVT1 BIT(22) ++#define ASPEED_ESPI_VW_SYSEVT BIT(8) ++#define ASPEED_ESPI_INT_EN 0x0C ++#define ASPEED_ESPI_DATA_PORT 0x28 ++#define ASPEED_ESPI_SYSEVT_INT_EN 0x94 ++#define ASPEED_ESPI_SYSEVT 0x98 ++#define ASPEED_ESPI_SYSEVT_HOST_RST_ACK BIT(27) ++#define ASPEED_ESPI_SYSEVT_SLAVE_BOOT_STATUS BIT(23) ++#define ASPEED_ESPI_SYSEVT_SLAVE_BOOT_DONE BIT(20) ++#define ASPEED_ESPI_SYSEVT_OOB_RST_ACK BIT(16) ++#define ASPEED_ESPI_SYSEVT_INT_T0 0x110 ++#define ASPEED_ESPI_SYSEVT_INT_T1 0x114 ++#define ASPEED_ESPI_SYSEVT_INT_T2 0x118 ++#define ASPEED_ESPI_SYSEVT_INT_STS 0x11C ++#define ASPEED_ESPI_SYSEVT_HOST_RST_WARN BIT(8) ++#define ASPEED_ESPI_SYSEVT_OOB_RST_WARN BIT(6) ++#define ASPEED_ESPI_SYSEVT_PLTRSTN BIT(5) ++#define ASPEED_ESPI_SYSEVT1_INT_EN 0x100 ++#define ASPEED_ESPI_SYSEVT1 0x104 ++#define ASPEED_ESPI_SYSEVT1_SUS_ACK BIT(20) ++#define ASPEED_ESPI_SYSEVT1_INT_T0 0x120 ++#define ASPEED_ESPI_SYSEVT1_INT_T1 0x124 ++#define ASPEED_ESPI_SYSEVT1_INT_T2 0x128 ++#define ASPEED_ESPI_SYSEVT1_INT_STS 0x12C ++#define ASPEED_ESPI_SYSEVT1_SUS_WARN BIT(0) ++ ++#define ASPEED_ESPI_INT_MASK \ ++ (ASPEED_ESPI_HW_RESET | \ ++ ASPEED_ESPI_VW_SYSEVT1 | \ ++ ASPEED_ESPI_VW_SYSEVT) ++ ++/* ++ * Setup Interrupt Type / Enable of System Event from Master ++ * T2 T1 T0 ++ * 1) HOST_RST_WARN : Dual Edge 1 0 0 ++ * 2) OOB_RST_WARN : Dual Edge 1 0 0 ++ * 3) PLTRSTN : Dual Edge 1 0 0 ++ */ ++#define ASPEED_ESPI_SYSEVT_INT_T0_MASK 0 ++#define ASPEED_ESPI_SYSEVT_INT_T1_MASK 0 ++#define ASPEED_ESPI_SYSEVT_INT_T2_MASK \ ++ (ASPEED_ESPI_SYSEVT_HOST_RST_WARN | \ ++ ASPEED_ESPI_SYSEVT_OOB_RST_WARN | \ ++ ASPEED_ESPI_SYSEVT_PLTRSTN) ++#define ASPEED_ESPI_SYSEVT_INT_MASK \ ++ (ASPEED_ESPI_SYSEVT_INT_T0_MASK | \ ++ ASPEED_ESPI_SYSEVT_INT_T1_MASK | \ ++ ASPEED_ESPI_SYSEVT_INT_T2_MASK) ++ ++/* ++ * Setup Interrupt Type / Enable of System Event 1 from Master ++ * T2 T1 T0 ++ * 1) SUS_WARN : Rising Edge 0 0 1 ++ */ ++#define ASPEED_ESPI_SYSEVT1_INT_T0_MASK ASPEED_ESPI_SYSEVT1_SUS_WARN ++#define ASPEED_ESPI_SYSEVT1_INT_T1_MASK 0 ++#define ASPEED_ESPI_SYSEVT1_INT_T2_MASK 0 ++#define ASPEED_ESPI_SYSEVT1_INT_MASK \ ++ (ASPEED_ESPI_SYSEVT1_INT_T0_MASK | \ ++ ASPEED_ESPI_SYSEVT1_INT_T1_MASK | \ ++ ASPEED_ESPI_SYSEVT1_INT_T2_MASK) ++ ++struct aspeed_espi { ++ struct regmap *map; ++ struct clk *clk; ++ struct device *dev; ++ int irq; ++ ++ /* for PLTRST_N signal monitoring interface */ ++ struct miscdevice pltrstn_miscdev; ++ spinlock_t pltrstn_lock; /* for PLTRST_N signal sampling */ ++ wait_queue_head_t pltrstn_waitq; ++ char pltrstn; +}; + -+static void aspeed_espi_slave_sys_event(struct platform_device *pdev) ++static void aspeed_espi_sys_event(struct aspeed_espi *priv) +{ -+ struct aspeed_espi_slave_data *priv = platform_get_drvdata(pdev); -+ struct device *dev = &pdev->dev; + u32 sts, evt; + -+ if (regmap_read(priv->map, ESPI_SYS_ISR, &sts) != 0 || -+ regmap_read(priv->map, ESPI_SYS_EVENT, &evt) != 0) { -+ dev_err(dev, "regmap_read failed\n"); -+ return; -+ } ++ regmap_read(priv->map, ASPEED_ESPI_SYSEVT_INT_STS, &sts); ++ regmap_read(priv->map, ASPEED_ESPI_SYSEVT, &evt); + -+ dev_dbg(dev, "sys: sts = %08x, evt = %08x\n", sts, evt); ++ dev_dbg(priv->dev, "sys: sts = %08x, evt = %08x\n", sts, evt); + -+ if ((evt & ESPI_SYSEVT_SLAVE_BOOT_STATUS) == 0) { -+ dev_info(dev, "Setting espi slave boot done\n"); -+ regmap_write(priv->map, ESPI_SYS_EVENT, -+ evt | ESPI_SYSEVT_SLAVE_BOOT_STATUS | -+ ESPI_SYSEVT_SLAVE_BOOT_DONE); ++ if (!(evt & ASPEED_ESPI_SYSEVT_SLAVE_BOOT_STATUS)) { ++ regmap_write(priv->map, ASPEED_ESPI_SYSEVT, ++ evt | ASPEED_ESPI_SYSEVT_SLAVE_BOOT_STATUS | ++ ASPEED_ESPI_SYSEVT_SLAVE_BOOT_DONE); ++ dev_dbg(priv->dev, "Setting espi slave boot done\n"); + } -+#if 0 -+ if (sts & ESPI_SYSEVT_HOST_RST_WARN) { -+ dev_info(dev, "ESPI_SYSEVT_HOST_RST_WARN; %s ack\n", -+ (evt & ESPI_SYSEVT_HOST_RST_WARN ? "send" : "clr")); -+ regmap_write_bits(priv->map, ESPI_SYS_EVENT, -+ ESPI_SYSEVT_HOST_RST_ACK, -+ evt & ESPI_SYSEVT_HOST_RST_WARN ? -+ ESPI_SYSEVT_HOST_RST_ACK : 0); ++ if (sts & ASPEED_ESPI_SYSEVT_HOST_RST_WARN && ++ evt & ASPEED_ESPI_SYSEVT_HOST_RST_WARN) { ++ regmap_write_bits(priv->map, ASPEED_ESPI_SYSEVT, ++ ASPEED_ESPI_SYSEVT_HOST_RST_ACK, ++ ASPEED_ESPI_SYSEVT_HOST_RST_ACK); ++ dev_dbg(priv->dev, "SYSEVT_HOST_RST_WARN: acked\n"); + } -+ if (sts & ESPI_SYSEVT_OOB_RST_WARN) { -+ dev_info(dev, "ESPI_SYSEVT_OOB_RST_WARN; %s ack\n", -+ (evt & ESPI_SYSEVT_OOB_RST_WARN ? "send" : "clr")); -+ regmap_write_bits(priv->map, ESPI_SYS_EVENT, -+ ESPI_SYSEVT_OOB_RST_ACK, -+ evt & ESPI_SYSEVT_OOB_RST_WARN ? -+ ESPI_SYSEVT_OOB_RST_ACK : 0); ++ if (sts & ASPEED_ESPI_SYSEVT_OOB_RST_WARN && ++ evt & ASPEED_ESPI_SYSEVT_OOB_RST_WARN) { ++ regmap_write_bits(priv->map, ASPEED_ESPI_SYSEVT, ++ ASPEED_ESPI_SYSEVT_OOB_RST_ACK, ++ ASPEED_ESPI_SYSEVT_OOB_RST_ACK); ++ dev_dbg(priv->dev, "SYSEVT_OOB_RST_WARN: acked\n"); + } -+#else -+ if (sts & ESPI_SYSEVT_HOST_RST_WARN) { -+ if (evt & ESPI_SYSEVT_HOST_RST_WARN) { -+ dev_info(dev, "ESPI_SYSEVT_HOST_RST_WARN; send ack\n"); -+ regmap_write_bits(priv->map, ESPI_SYS_EVENT, -+ ESPI_SYSEVT_HOST_RST_ACK, ESPI_SYSEVT_HOST_RST_ACK); -+ } ++ if (sts & ASPEED_ESPI_SYSEVT_PLTRSTN || priv->pltrstn == 'U') { ++ priv->pltrstn = (evt & ASPEED_ESPI_SYSEVT_PLTRSTN) ? '1' : '0'; ++ wake_up_interruptible(&priv->pltrstn_waitq); ++ dev_dbg(priv->dev, "SYSEVT_PLTRSTN: %c\n", priv->pltrstn); + } -+ if (sts & ESPI_SYSEVT_OOB_RST_WARN) { -+ if (evt & ESPI_SYSEVT_OOB_RST_WARN) { -+ dev_info(dev, "ESPI_SYSEVT_OOB_RST_WARN; send ack\n"); -+ regmap_write_bits(priv->map, ESPI_SYS_EVENT, -+ ESPI_SYSEVT_OOB_RST_ACK, ESPI_SYSEVT_OOB_RST_ACK); -+ } -+ } -+#endif -+ regmap_write(priv->map, ESPI_SYS_ISR, sts); ++ ++ regmap_write(priv->map, ASPEED_ESPI_SYSEVT_INT_STS, sts); +} + -+static void aspeed_espi_slave_sys1_event(struct platform_device *pdev) ++static void aspeed_espi_sys_event1(struct aspeed_espi *priv) +{ -+ struct aspeed_espi_slave_data *priv = platform_get_drvdata(pdev); -+ struct device *dev = &pdev->dev; + u32 sts, evt; + -+ if (regmap_read(priv->map, ESPI_SYS1_ISR, &sts) != 0 || -+ regmap_read(priv->map, ESPI_SYS1_EVENT, &evt) != 0) { -+ dev_err(dev, "regmap_read failed\n"); -+ return; -+ } -+ dev_dbg(dev, "sys1: sts = %08x, evt = %08x\n", sts, evt); -+ -+#if 0 -+ if (sts & ESPI_SYSEVT1_SUS_WARN) { -+ dev_info(dev, "ESPI_SYSEVT1_SUS_WARN; %s ack\n", -+ (evt & ESPI_SYSEVT1_SUS_WARN ? "send" : "clr")); -+ regmap_write_bits(priv->map, ESPI_SYS1_EVENT, -+ ESPI_SYSEVT1_SUS_ACK, -+ evt & ESPI_SYSEVT1_SUS_WARN ? -+ ESPI_SYSEVT1_SUS_ACK : 0); -+ } -+#else -+ if (sts & ESPI_SYSEVT1_SUS_WARN) { -+ if (evt & ESPI_SYSEVT1_SUS_WARN) { -+ dev_info(dev, "ESPI_SYSEVT_OOB_RST_WARN; send ack\n"); -+ regmap_write_bits(priv->map, ESPI_SYS1_EVENT, -+ ESPI_SYSEVT1_SUS_ACK, ESPI_SYSEVT1_SUS_ACK); -+ } ++ regmap_read(priv->map, ASPEED_ESPI_SYSEVT1_INT_STS, &sts); ++ regmap_read(priv->map, ASPEED_ESPI_SYSEVT1, &evt); ++ ++ dev_dbg(priv->dev, "sys event1: sts = %08x, evt = %08x\n", sts, evt); ++ ++ if (sts & ASPEED_ESPI_SYSEVT1_SUS_WARN && ++ evt & ASPEED_ESPI_SYSEVT1_SUS_WARN) { ++ regmap_write_bits(priv->map, ASPEED_ESPI_SYSEVT1, ++ ASPEED_ESPI_SYSEVT1_SUS_ACK, ++ ASPEED_ESPI_SYSEVT1_SUS_ACK); ++ dev_dbg(priv->dev, "SYSEVT1_SUS_WARN: acked\n"); + } -+#endif -+ regmap_write(priv->map, ESPI_SYS1_ISR, sts); ++ ++ regmap_write(priv->map, ASPEED_ESPI_SYSEVT1_INT_STS, sts); +} + -+static void aspeed_espi_slave_boot_ack(struct platform_device *pdev) ++static void aspeed_espi_boot_ack(struct aspeed_espi *priv) +{ -+ struct aspeed_espi_slave_data *priv = platform_get_drvdata(pdev); -+ struct device *dev = &pdev->dev; + u32 evt; + -+ if (regmap_read(priv->map, ESPI_SYS_EVENT, &evt) == 0 && -+ (evt & ESPI_SYSEVT_SLAVE_BOOT_STATUS) == 0) { -+ dev_info(dev, "Setting espi slave boot done\n"); -+ regmap_write(priv->map, ESPI_SYS_EVENT, -+ evt | ESPI_SYSEVT_SLAVE_BOOT_STATUS | -+ ESPI_SYSEVT_SLAVE_BOOT_DONE); ++ regmap_read(priv->map, ASPEED_ESPI_SYSEVT, &evt); ++ if (!(evt & ASPEED_ESPI_SYSEVT_SLAVE_BOOT_STATUS)) { ++ regmap_write(priv->map, ASPEED_ESPI_SYSEVT, ++ evt | ASPEED_ESPI_SYSEVT_SLAVE_BOOT_STATUS | ++ ASPEED_ESPI_SYSEVT_SLAVE_BOOT_DONE); ++ dev_dbg(priv->dev, "Setting espi slave boot done\n"); + } + -+ if (regmap_read(priv->map, ESPI_SYS1_EVENT, &evt) == 0 && -+ (evt & ESPI_SYSEVT1_SUS_WARN) != 0 && -+ (evt & ESPI_SYSEVT1_SUS_ACK) == 0) { -+ dev_info(dev, "Boot SUS WARN set; send ack\n"); -+ regmap_write(priv->map, ESPI_SYS1_EVENT, -+ evt | ESPI_SYSEVT1_SUS_ACK); ++ regmap_read(priv->map, ASPEED_ESPI_SYSEVT1, &evt); ++ if (evt & ASPEED_ESPI_SYSEVT1_SUS_WARN && ++ !(evt & ASPEED_ESPI_SYSEVT1_SUS_ACK)) { ++ regmap_write(priv->map, ASPEED_ESPI_SYSEVT1, ++ evt | ASPEED_ESPI_SYSEVT1_SUS_ACK); ++ dev_dbg(priv->dev, "Boot SYSEVT1_SUS_WARN: acked\n"); + } +} + -+static irqreturn_t aspeed_espi_slave_irq(int irq, void *arg) ++static irqreturn_t aspeed_espi_irq(int irq, void *arg) +{ -+ struct platform_device *pdev = arg; -+ struct aspeed_espi_slave_data *priv = platform_get_drvdata(pdev); -+ struct device *dev = &pdev->dev; -+ u32 sts; -+ -+ if (regmap_read(priv->map, ESPI_ISR, &sts) != 0) { -+ dev_err(dev, "regmap_read failed\n"); -+ return IRQ_NONE; -+ } ++ struct aspeed_espi *priv = arg; ++ u32 sts, sts_handled = 0; + -+ dev_dbg(dev, "ESPI_ISR: %08x\n", sts); ++ regmap_read(priv->map, ASPEED_ESPI_INT_STS, &sts); + -+ if (sts & ESPI_ISR_VW_SYS_EVT) -+ aspeed_espi_slave_sys_event(pdev); ++ dev_dbg(priv->dev, "INT_STS: 0x%08x\n", sts); + -+ if (sts & ESPI_ISR_VW_SYS_EVT1) -+ aspeed_espi_slave_sys1_event(pdev); ++ if (sts & ASPEED_ESPI_VW_SYSEVT) { ++ aspeed_espi_sys_event(priv); ++ sts_handled |= ASPEED_ESPI_VW_SYSEVT; ++ } + -+ /* -+ if (sts & ESPI_ISR_HW_RESET) { -+ regmap_write_bits(priv->map, ESPI_CTRL, -+ ESPI_CTRL_SW_RESET, 0); -+ regmap_write_bits(priv->map, ESPI_CTRL, -+ ESPI_CTRL_SW_RESET, ESPI_CTRL_SW_RESET); ++ if (sts & ASPEED_ESPI_VW_SYSEVT1) { ++ aspeed_espi_sys_event1(priv); ++ sts_handled |= ASPEED_ESPI_VW_SYSEVT1; ++ } + -+ aspeed_espi_slave_boot_ack(pdev); ++ if (sts & ASPEED_ESPI_HW_RESET) { ++ regmap_write_bits(priv->map, ASPEED_ESPI_CTRL, ++ ASPEED_ESPI_CTRL_SW_RESET, 0); ++ regmap_write_bits(priv->map, ASPEED_ESPI_CTRL, ++ ASPEED_ESPI_CTRL_SW_RESET, ++ ASPEED_ESPI_CTRL_SW_RESET); ++ aspeed_espi_boot_ack(priv); ++ sts_handled |= ASPEED_ESPI_HW_RESET; + } -+ */ + -+ regmap_write(priv->map, ESPI_ISR, sts); ++ regmap_write(priv->map, ASPEED_ESPI_INT_STS, sts); + -+ return IRQ_HANDLED; ++ return sts != sts_handled ? IRQ_NONE : IRQ_HANDLED; +} + -+/* Setup Interrupt Type/Enable of System Event from Master -+ * T2 T1 T0 -+ * 1). HOST_RST_WARN : Dual Edge 1 0 0 -+ * 2). OOB_RST_WARN : Dual Edge 1 0 0 -+ * 3). PLTRST_N : Dual Edge 1 0 0 -+ */ -+#define ESPI_SYS_INT_T0_SET 0x00000000 -+#define ESPI_SYS_INT_T1_SET 0x00000000 -+#define ESPI_SYS_INT_T2_SET \ -+(ESPI_SYSEVT_HOST_RST_WARN | ESPI_SYSEVT_OOB_RST_WARN | ESPI_SYSEVT_PLT_RST_N) -+#define ESPI_SYS_INT_SET \ -+(ESPI_SYSEVT_HOST_RST_WARN | ESPI_SYSEVT_OOB_RST_WARN | ESPI_SYSEVT_PLT_RST_N) -+ -+/* Setup Interrupt Type/Enable of System Event 1 from Master -+ * T2 T1 T0 -+ * 1). SUS_WARN : Rising Edge 0 0 1 -+ */ -+#define ESPI_SYS1_INT_T0_SET ESPI_SYSEVT1_SUS_WARN -+#define ESPI_SYS1_INT_T1_SET 0x00000000 -+#define ESPI_SYS1_INT_T2_SET 0x00000000 -+#define ESPI_SYS1_INT_SET ESPI_SYSEVT1_SUS_WARN ++static void aspeed_espi_config_irq(struct aspeed_espi *priv) ++{ ++ regmap_write(priv->map, ASPEED_ESPI_SYSEVT_INT_T0, ++ ASPEED_ESPI_SYSEVT_INT_T0_MASK); ++ regmap_write(priv->map, ASPEED_ESPI_SYSEVT_INT_T1, ++ ASPEED_ESPI_SYSEVT_INT_T1_MASK); ++ regmap_write(priv->map, ASPEED_ESPI_SYSEVT_INT_T2, ++ ASPEED_ESPI_SYSEVT_INT_T2_MASK); ++ regmap_write(priv->map, ASPEED_ESPI_SYSEVT_INT_EN, ++ ASPEED_ESPI_SYSEVT_INT_MASK); ++ ++ regmap_write(priv->map, ASPEED_ESPI_SYSEVT1_INT_T0, ++ ASPEED_ESPI_SYSEVT1_INT_T0_MASK); ++ regmap_write(priv->map, ASPEED_ESPI_SYSEVT1_INT_T1, ++ ASPEED_ESPI_SYSEVT1_INT_T1_MASK); ++ regmap_write(priv->map, ASPEED_ESPI_SYSEVT1_INT_T2, ++ ASPEED_ESPI_SYSEVT1_INT_T2_MASK); ++ regmap_write(priv->map, ASPEED_ESPI_SYSEVT1_INT_EN, ++ ASPEED_ESPI_SYSEVT1_INT_MASK); ++ ++ regmap_write(priv->map, ASPEED_ESPI_INT_EN, ASPEED_ESPI_INT_MASK); ++ ++ aspeed_espi_boot_ack(priv); ++} + -+static int aspeed_espi_slave_config_irq(struct platform_device *pdev) ++static inline struct aspeed_espi *to_aspeed_espi(struct file *filp) +{ -+ struct aspeed_espi_slave_data *priv = platform_get_drvdata(pdev); -+ struct device *dev = &pdev->dev; -+ int irq; -+ int rc; ++ return container_of(filp->private_data, struct aspeed_espi, ++ pltrstn_miscdev); ++} + -+ irq = platform_get_irq(pdev, 0); -+ if (irq < 0) -+ return irq; ++static int aspeed_espi_pltrstn_open(struct inode *inode, struct file *filp) ++{ ++ if ((filp->f_flags & O_ACCMODE) != O_RDONLY) ++ return -EACCES; + -+ regmap_write_bits(priv->map, ESPI_CTRL, ESPI_CTRL_OOB_CHRDY, -+ ESPI_CTRL_OOB_CHRDY); ++ return 0; ++} + -+ regmap_write(priv->map, ESPI_SYS_INT_T0, ESPI_SYS_INT_T0_SET); -+ regmap_write(priv->map, ESPI_SYS_INT_T1, ESPI_SYS_INT_T1_SET); -+ regmap_write(priv->map, ESPI_SYS_INT_T2, ESPI_SYS_INT_T2_SET); -+ regmap_write(priv->map, ESPI_SYS_IER, ESPI_SYS_INT_SET); ++static ssize_t aspeed_espi_pltrstn_read(struct file *filp, char __user *buf, ++ size_t count, loff_t *offset) ++{ ++ struct aspeed_espi *priv = to_aspeed_espi(filp); ++ DECLARE_WAITQUEUE(wait, current); ++ unsigned long flags; ++ char old_sample; ++ int ret = 0; + -+ regmap_write(priv->map, ESPI_SYS1_INT_T0, ESPI_SYS1_INT_T0_SET); -+ regmap_write(priv->map, ESPI_SYS1_INT_T1, ESPI_SYS1_INT_T1_SET); -+ regmap_write(priv->map, ESPI_SYS1_INT_T2, ESPI_SYS1_INT_T2_SET); -+ regmap_write(priv->map, ESPI_SYS1_IER, ESPI_SYS1_INT_SET); ++ spin_lock_irqsave(&priv->pltrstn_lock, flags); + -+ regmap_write(priv->map, ESPI_IER, 0xFFFFFFFF); ++ add_wait_queue(&priv->pltrstn_waitq, &wait); ++ set_current_state(TASK_INTERRUPTIBLE); + -+ aspeed_espi_slave_boot_ack(pdev); ++ old_sample = priv->pltrstn; + -+ rc = devm_request_irq(dev, irq, aspeed_espi_slave_irq, IRQF_SHARED, -+ dev_name(dev), pdev); -+ if (rc < 0) -+ return rc; ++ do { ++ char new_sample = priv->pltrstn; + -+ return 0; ++ if (filp->f_flags & O_NONBLOCK || old_sample != new_sample) { ++ ret = put_user(new_sample, (unsigned long __user *)buf); ++ if (!ret) ++ ret = sizeof(new_sample); ++ } else if (signal_pending(current)) { ++ ret = -ERESTARTSYS; ++ } ++ ++ if (!ret) { ++ spin_unlock_irqrestore(&priv->pltrstn_lock, flags); ++ schedule(); ++ spin_lock_irqsave(&priv->pltrstn_lock, flags); ++ } ++ } while (!ret); ++ ++ remove_wait_queue(&priv->pltrstn_waitq, &wait); ++ set_current_state(TASK_RUNNING); ++ ++ spin_unlock_irqrestore(&priv->pltrstn_lock, flags); ++ ++ return ret; +} + -+static const struct regmap_config espi_slave_regmap_cfg = { -+ .reg_bits = 32, -+ .reg_stride = 4, -+ .val_bits = 32, -+ .max_register = ESPI_SYS1_ISR, ++static const struct file_operations aspeed_espi_pltrstn_fops = { ++ .owner = THIS_MODULE, ++ .open = aspeed_espi_pltrstn_open, ++ .read = aspeed_espi_pltrstn_read, ++}; ++ ++static const struct regmap_config aspeed_espi_regmap_cfg = { ++ .reg_bits = 32, ++ .reg_stride = 4, ++ .val_bits = 32, ++ .max_register = ASPEED_ESPI_SYSEVT1_INT_STS, +}; + -+static int aspeed_espi_slave_probe(struct platform_device *pdev) ++static int aspeed_espi_probe(struct platform_device *pdev) +{ -+ struct aspeed_espi_slave_data *priv; -+ struct device *dev = &pdev->dev; ++ struct aspeed_espi *priv; + struct resource *res; + void __iomem *regs; -+ int rc; ++ u32 ctrl; ++ int ret; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -+ regs = devm_ioremap_resource(dev, res); ++ regs = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(regs)) + return PTR_ERR(regs); + -+ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); ++ priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + -+ priv->map = devm_regmap_init_mmio(dev, regs, &espi_slave_regmap_cfg); ++ dev_set_drvdata(&pdev->dev, priv); ++ priv->dev = &pdev->dev; ++ ++ priv->map = devm_regmap_init_mmio(&pdev->dev, regs, ++ &aspeed_espi_regmap_cfg); + if (IS_ERR(priv->map)) + return PTR_ERR(priv->map); + -+ priv->clk = devm_clk_get(dev, NULL); ++ spin_lock_init(&priv->pltrstn_lock); ++ init_waitqueue_head(&priv->pltrstn_waitq); ++ priv->pltrstn = 'U'; /* means it's not reported yet from master */ ++ ++ priv->irq = platform_get_irq(pdev, 0); ++ if (priv->irq < 0) ++ return priv->irq; ++ ++ aspeed_espi_config_irq(priv); ++ ++ ret = devm_request_irq(&pdev->dev, priv->irq, aspeed_espi_irq, 0, ++ "aspeed-espi-irq", priv); ++ if (ret) ++ return ret; ++ ++ priv->clk = devm_clk_get(&pdev->dev, NULL); + if (IS_ERR(priv->clk)) { -+ dev_err(dev, "couldn't get clock\n"); -+ return PTR_ERR(priv->clk); ++ ret = PTR_ERR(priv->clk); ++ if (ret != -EPROBE_DEFER) ++ dev_err(&pdev->dev, "couldn't get clock\n"); ++ return ret; + } -+ rc = clk_prepare_enable(priv->clk); -+ if (rc) { -+ dev_err(dev, "couldn't enable clock\n"); -+ return rc; ++ ret = clk_prepare_enable(priv->clk); ++ if (ret) { ++ dev_err(&pdev->dev, "couldn't enable clock\n"); ++ return ret; + } + -+ dev_set_name(dev, DEVICE_NAME); -+ -+ platform_set_drvdata(pdev, priv); -+ -+ rc = aspeed_espi_slave_config_irq(pdev); -+ if (rc) { -+ platform_set_drvdata(pdev, NULL); -+ goto err; ++ /* ++ * We check that the regmap works on this very first access, but as this ++ * is an MMIO-backed regmap, subsequent regmap access is not going to ++ * fail and we skip error checks from this point. ++ */ ++ ret = regmap_read(priv->map, ASPEED_ESPI_CTRL, &ctrl); ++ if (ret) { ++ dev_err(&pdev->dev, "failed to read ctrl register\n"); ++ goto err_clk_disable_out; ++ } ++ regmap_write(priv->map, ASPEED_ESPI_CTRL, ++ ctrl | ASPEED_ESPI_CTRL_OOB_CHRDY); ++ ++ priv->pltrstn_miscdev.minor = MISC_DYNAMIC_MINOR; ++ priv->pltrstn_miscdev.name = "espi-pltrstn"; ++ priv->pltrstn_miscdev.fops = &aspeed_espi_pltrstn_fops; ++ priv->pltrstn_miscdev.parent = &pdev->dev; ++ ++ ret = misc_register(&priv->pltrstn_miscdev); ++ if (ret) { ++ dev_err(&pdev->dev, "Unable to register device\n"); ++ goto err_clk_disable_out; + } + -+ dev_info(dev, "aspeed,ast2500-espi-slave probe complete\n"); ++ dev_info(&pdev->dev, "eSPI registered, irq %d\n", priv->irq); ++ + return 0; + -+err: ++err_clk_disable_out: + clk_disable_unprepare(priv->clk); -+ return rc; -+} + ++ return ret; ++} + -+static int aspeed_espi_slave_remove(struct platform_device *pdev) ++static int aspeed_espi_remove(struct platform_device *pdev) +{ -+ struct aspeed_espi_slave_data *priv = platform_get_drvdata(pdev); ++ struct aspeed_espi *priv = dev_get_drvdata(&pdev->dev); + ++ misc_deregister(&priv->pltrstn_miscdev); + clk_disable_unprepare(priv->clk); + + return 0; +} + -+static const struct of_device_id of_espi_slave_match_table[] = { ++static const struct of_device_id of_espi_match_table[] = { + { .compatible = "aspeed,ast2500-espi-slave" }, + { } +}; -+MODULE_DEVICE_TABLE(of, of_espi_slave_match_table); ++MODULE_DEVICE_TABLE(of, of_espi_match_table); + -+static struct platform_driver aspeed_espi_slave_driver = { -+ .driver = { -+ .name = DEVICE_NAME, -+ .of_match_table = of_match_ptr(of_espi_slave_match_table), ++static struct platform_driver aspeed_espi_driver = { ++ .driver = { ++ .name = KBUILD_MODNAME, ++ .of_match_table = of_match_ptr(of_espi_match_table), + }, -+ .probe = aspeed_espi_slave_probe, -+ .remove = aspeed_espi_slave_remove, ++ .probe = aspeed_espi_probe, ++ .remove = aspeed_espi_remove, +}; -+module_platform_driver(aspeed_espi_slave_driver); ++module_platform_driver(aspeed_espi_driver); + -+MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Haiyue Wang <haiyue.wang@linux.intel.com>"); -+MODULE_DESCRIPTION("Linux device interface to the eSPI slave"); ++MODULE_AUTHOR("Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>"); ++MODULE_DESCRIPTION("Aspeed eSPI driver"); ++MODULE_LICENSE("GPL v2"); -- 2.7.4 diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0026-Add-support-for-new-PECI-commands.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0026-Add-support-for-new-PECI-commands.patch index 53060daf7..4dc14d3b1 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0026-Add-support-for-new-PECI-commands.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0026-Add-support-for-new-PECI-commands.patch @@ -1,24 +1,26 @@ -From 8d5f080b38d1b652eb5fdd3a7b74164906680ab7 Mon Sep 17 00:00:00 2001 +From 5f43a95bd032279440196a1c9802e1dec5d24a65 Mon Sep 17 00:00:00 2001 From: "Jason M. Bills" <jason.m.bills@intel.com> Date: Wed, 4 Apr 2018 13:52:39 -0700 Subject: [PATCH] Add support for new PECI commands Signed-off-by: Jason M. Bills <jason.m.bills@intel.com> Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> +Signed-off-by: Zhu, Yunge <yunge.zhu@linux.intel.com> --- - drivers/peci/peci-core.c | 396 ++++++++++++++++++++++++++++++++++++++++ - include/uapi/linux/peci-ioctl.h | 146 +++++++++++++++ - 2 files changed, 542 insertions(+) + drivers/peci/peci-core.c | 430 ++++++++++++++++++++++++++++++++++++++++ + include/uapi/linux/peci-ioctl.h | 179 +++++++++++++++++ + 2 files changed, 609 insertions(+) diff --git a/drivers/peci/peci-core.c b/drivers/peci/peci-core.c -index d1f0df8b139a..b99ba788a032 100644 +index 2a6be04..43a86a0 100644 --- a/drivers/peci/peci-core.c +++ b/drivers/peci/peci-core.c -@@ -318,6 +318,12 @@ static int peci_scan_cmd_mask(struct peci_adapter *adapter) +@@ -318,6 +318,13 @@ static int peci_scan_cmd_mask(struct peci_adapter *adapter) * See PECI Spec Table 3-1. */ revision = FIELD_GET(REVISION_NUM_MASK, dib); + if (revision >= 0x40) { /* Rev. 4.0 */ ++ adapter->cmd_mask |= BIT(PECI_CMD_RD_IA_MSREX); + adapter->cmd_mask |= BIT(PECI_CMD_RD_END_PT_CFG); + adapter->cmd_mask |= BIT(PECI_CMD_WR_END_PT_CFG); + adapter->cmd_mask |= BIT(PECI_CMD_CRASHDUMP_DISC); @@ -27,7 +29,61 @@ index d1f0df8b139a..b99ba788a032 100644 if (revision >= 0x36) /* Rev. 3.6 */ adapter->cmd_mask |= BIT(PECI_CMD_WR_IA_MSR); if (revision >= 0x35) /* Rev. 3.5 */ -@@ -687,6 +693,392 @@ static int peci_cmd_wr_pci_cfg_local(struct peci_adapter *adapter, void *vmsg) +@@ -375,14 +382,18 @@ static int peci_cmd_xfer(struct peci_adapter *adapter, void *vmsg) + switch (msg->tx_buf[0]) { + case PECI_RDPKGCFG_CMD: + case PECI_RDIAMSR_CMD: ++ case PECI_RDIAMSREX_CMD: + case PECI_RDPCICFG_CMD: + case PECI_RDPCICFGLOCAL_CMD: ++ case PECI_RDENDPTCFG_CMD: ++ case PECI_CRASHDUMP_CMD: + ret = peci_xfer_with_retries(adapter, msg, false); + break; + case PECI_WRPKGCFG_CMD: + case PECI_WRIAMSR_CMD: + case PECI_WRPCICFG_CMD: + case PECI_WRPCICFGLOCAL_CMD: ++ case PECI_WRENDPTCFG_CMD: + /* Check if the AW FCS byte is already provided */ + ret = peci_aw_fcs(msg, 2 + msg->tx_len, &aw_fcs); + if (ret) +@@ -590,6 +601,34 @@ static int peci_cmd_rd_ia_msr(struct peci_adapter *adapter, void *vmsg) + return ret; + } + ++static int peci_cmd_rd_ia_msrex(struct peci_adapter *adapter, void *vmsg) ++{ ++ struct peci_rd_ia_msrex_msg *umsg = vmsg; ++ struct peci_xfer_msg *msg; ++ int ret; ++ ++ msg = peci_get_xfer_msg(PECI_RDIAMSREX_WRITE_LEN, PECI_RDIAMSREX_READ_LEN); ++ if (!msg) ++ return -ENOMEM; ++ ++ msg->addr = umsg->addr; ++ msg->tx_buf[0] = PECI_RDIAMSREX_CMD; ++ msg->tx_buf[1] = 0; ++ msg->tx_buf[2] = (u8)umsg->thread_id; ++ msg->tx_buf[3] = (u8)(umsg->thread_id >> 8); ++ msg->tx_buf[4] = (u8)umsg->address; ++ msg->tx_buf[5] = (u8)(umsg->address >> 8); ++ ++ ret = peci_xfer_with_retries(adapter, msg, false); ++ if (!ret) ++ memcpy(&umsg->value, &msg->rx_buf[1], sizeof(uint64_t)); ++ ++ umsg->cc = msg->rx_buf[0]; ++ peci_put_xfer_msg(msg); ++ ++ return ret; ++} ++ + static int peci_cmd_wr_ia_msr(struct peci_adapter *adapter, void *vmsg) + { + return -ENOSYS; /* Not implemented yet */ +@@ -730,6 +769,392 @@ static int peci_cmd_wr_pci_cfg_local(struct peci_adapter *adapter, void *vmsg) return ret; } @@ -420,7 +476,12 @@ index d1f0df8b139a..b99ba788a032 100644 typedef int (*peci_cmd_fn_type)(struct peci_adapter *, void *); static const peci_cmd_fn_type peci_cmd_fn[PECI_CMD_MAX] = { -@@ -702,6 +1094,10 @@ static const peci_cmd_fn_type peci_cmd_fn[PECI_CMD_MAX] = { +@@ -741,10 +1166,15 @@ static const peci_cmd_fn_type peci_cmd_fn[PECI_CMD_MAX] = { + peci_cmd_wr_pkg_cfg, + peci_cmd_rd_ia_msr, + peci_cmd_wr_ia_msr, ++ peci_cmd_rd_ia_msrex, + peci_cmd_rd_pci_cfg, peci_cmd_wr_pci_cfg, peci_cmd_rd_pci_cfg_local, peci_cmd_wr_pci_cfg_local, @@ -432,10 +493,23 @@ index d1f0df8b139a..b99ba788a032 100644 /** diff --git a/include/uapi/linux/peci-ioctl.h b/include/uapi/linux/peci-ioctl.h -index 253fb42e38b7..405cd8edbcbf 100644 +index 253fb42..1158254 100644 --- a/include/uapi/linux/peci-ioctl.h +++ b/include/uapi/linux/peci-ioctl.h -@@ -71,6 +71,10 @@ enum peci_cmd { +@@ -47,6 +47,7 @@ + * @PECI_CMD_WR_PKG_CFG: write access to the PCS (Package Configuration Space) + * @PECI_CMD_RD_IA_MSR: read access to MSRs (Model Specific Registers) + * @PECI_CMD_WR_IA_MSR: write access to MSRs (Model Specific Registers) ++ * @PECI_CMD_RD_IA_MSREX: read access to MSRs (Model Specific Registers) + * @PECI_CMD_RD_PCI_CFG: sideband read access to the PCI configuration space + * maintained in downstream devices external to the processor + * @PECI_CMD_WR_PCI_CFG: sideband write access to the PCI configuration space +@@ -67,10 +68,15 @@ enum peci_cmd { + PECI_CMD_WR_PKG_CFG, + PECI_CMD_RD_IA_MSR, + PECI_CMD_WR_IA_MSR, ++ PECI_CMD_RD_IA_MSREX, + PECI_CMD_RD_PCI_CFG, PECI_CMD_WR_PCI_CFG, PECI_CMD_RD_PCI_CFG_LOCAL, PECI_CMD_WR_PCI_CFG_LOCAL, @@ -446,7 +520,42 @@ index 253fb42e38b7..405cd8edbcbf 100644 PECI_CMD_MAX }; -@@ -438,6 +442,132 @@ struct peci_wr_pci_cfg_local_msg { +@@ -312,6 +318,34 @@ struct peci_wr_ia_msr_msg { + } __attribute__((__packed__)); + + /** ++ * struct peci_rd_ia_msrex_msg - RdIAMSREX command ++ * @addr: address of the client ++ * @thread_id: ID of the specific logical processor ++ * @address: address of MSR to read from ++ * @cc: completion code ++ * @value: data to be read ++ * ++ * The RdIAMSREX() PECI command provides read access to Model Specific Registers ++ * (MSRs) defined in the processor's Intel Architecture (IA). ++ * The differences between RdIAMSREX() and RdIAMSR() are that: ++ * (1)RdIAMSR() can only read MC registers, RdIAMSREX() can read all MSRs ++ * (2)thread_id of RdIAMSR() is u8, thread_id of RdIAMSREX() is u16 ++ */ ++struct peci_rd_ia_msrex_msg { ++#define PECI_RDIAMSREX_WRITE_LEN 6 ++#define PECI_RDIAMSREX_READ_LEN 9 ++#define PECI_RDIAMSREX_CMD 0xd1 ++ ++ __u8 addr; ++ __u8 padding0; ++ __u16 thread_id; ++ __u16 address; ++ __u8 cc; ++ __u8 padding1; ++ __u64 value; ++} __attribute__((__packed__)); ++ ++/** + * struct peci_rd_pci_cfg_msg - RdPCIConfig command + * @addr: address of the client + * @bus: PCI bus number +@@ -438,6 +472,132 @@ struct peci_wr_pci_cfg_local_msg { __u32 value; } __attribute__((__packed__)); @@ -579,7 +688,17 @@ index 253fb42e38b7..405cd8edbcbf 100644 #define PECI_IOC_BASE 0xb7 #define PECI_IOC_XFER \ -@@ -478,4 +608,20 @@ struct peci_wr_pci_cfg_local_msg { +@@ -464,6 +624,9 @@ struct peci_wr_pci_cfg_local_msg { + #define PECI_IOC_WR_IA_MSR \ + _IOWR(PECI_IOC_BASE, PECI_CMD_WR_IA_MSR, struct peci_wr_ia_msr_msg) + ++#define PECI_IOC_RD_IA_MSREX \ ++ _IOWR(PECI_IOC_BASE, PECI_CMD_RD_IA_MSREX, struct peci_rd_ia_msrex_msg) ++ + #define PECI_IOC_RD_PCI_CFG \ + _IOWR(PECI_IOC_BASE, PECI_CMD_RD_PCI_CFG, struct peci_rd_pci_cfg_msg) + +@@ -478,4 +641,20 @@ struct peci_wr_pci_cfg_local_msg { _IOWR(PECI_IOC_BASE, PECI_CMD_WR_PCI_CFG_LOCAL, \ struct peci_wr_pci_cfg_local_msg) diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0030-Add-dump-debug-code-into-I2C-drivers.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0030-Add-dump-debug-code-into-I2C-drivers.patch index d828233fe..bef1d0ae8 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0030-Add-dump-debug-code-into-I2C-drivers.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0030-Add-dump-debug-code-into-I2C-drivers.patch @@ -1,4 +1,4 @@ -From 38c04788647a95e3951674eb802f1f99ecdde164 Mon Sep 17 00:00:00 2001 +From 8b9bca54ec03fb80834eb8d15dd599293af6d971 Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo <jae.hyun.yoo@intel.com> Date: Fri, 29 Jun 2018 11:00:02 -0700 Subject: [PATCH] Add dump debug code into I2C drivers @@ -20,7 +20,7 @@ Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> 2 files changed, 50 insertions(+) diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c -index fa66951b05d0..434b753def3b 100644 +index c2a6e5a27314..e1719b1f2020 100644 --- a/drivers/i2c/busses/i2c-aspeed.c +++ b/drivers/i2c/busses/i2c-aspeed.c @@ -163,6 +163,21 @@ struct aspeed_i2c_bus { @@ -65,7 +65,7 @@ index fa66951b05d0..434b753def3b 100644 return bus->master_xfer_result; } -@@ -1061,6 +1082,11 @@ static struct platform_driver aspeed_i2c_bus_driver = { +@@ -1065,6 +1086,11 @@ static struct platform_driver aspeed_i2c_bus_driver = { }; module_platform_driver(aspeed_i2c_bus_driver); diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0031-Add-high-speed-baud-rate-support-for-UART.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0031-Add-high-speed-baud-rate-support-for-UART.patch index 803701286..931483954 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0031-Add-high-speed-baud-rate-support-for-UART.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0031-Add-high-speed-baud-rate-support-for-UART.patch @@ -1,4 +1,4 @@ -From 01c8d6a5146cd39c2286f659e21f1a1042aa741a Mon Sep 17 00:00:00 2001 +From d80fcbb3e9d95a7e926598290012eea88a7c474d Mon Sep 17 00:00:00 2001 From: Yong Li <yong.b.li@linux.intel.com> Date: Wed, 2 Jan 2019 15:06:43 +0800 Subject: [PATCH] Add high speed baud rate support for UART @@ -14,29 +14,29 @@ bootloader(u-boot) will set SCU4C based on the environment configuration Signed-off-by: Yong Li <yong.b.li@linux.intel.com> --- - drivers/clk/clk-aspeed.c | 41 +++++++++++++++++++++++++++----- + drivers/clk/clk-aspeed.c | 44 +++++++++++++++++++++++++++----- include/dt-bindings/clock/aspeed-clock.h | 2 ++ - 2 files changed, 37 insertions(+), 6 deletions(-) + 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/drivers/clk/clk-aspeed.c b/drivers/clk/clk-aspeed.c -index 42b4df6ba249..97c27820db3e 100644 +index 9bd5155598d6..24d56a724969 100644 --- a/drivers/clk/clk-aspeed.c +++ b/drivers/clk/clk-aspeed.c @@ -14,7 +14,9 @@ - #include <dt-bindings/clock/aspeed-clock.h> + #include "clk-aspeed.h" --#define ASPEED_NUM_CLKS 36 +-#define ASPEED_NUM_CLKS 38 +#define ASPEED_NUM_CLKS ASPEED_CLK_MAX -+#define UART_HIGH_SPEED_CLK 192000000 -+#define UART_LOW_SPEED_CLK 24000000 ++#define UART_HIGH_SPEED_CLK 192000000 ++#define UART_LOW_SPEED_CLK 24000000 #define ASPEED_RESET2_OFFSET 32 -@@ -28,6 +30,12 @@ - #define AST2400_HPLL_BYPASS_EN BIT(17) +@@ -29,6 +31,12 @@ #define ASPEED_MISC_CTRL 0x2c #define UART_DIV13_EN BIT(12) + #define ASPEED_MAC_CLK_DLY 0x48 +#define ASPEED_MISC2_CTRL 0x4c +#define UART1_HS_CLK_EN BIT(24) +#define UART2_HS_CLK_EN BIT(25) @@ -46,35 +46,38 @@ index 42b4df6ba249..97c27820db3e 100644 #define ASPEED_STRAP 0x70 #define CLKIN_25MHZ_EN BIT(23) #define AST2400_CLK_SOURCE_SEL BIT(18) -@@ -446,7 +454,7 @@ static int aspeed_clk_probe(struct platform_device *pdev) +@@ -386,7 +394,7 @@ static int aspeed_clk_probe(struct platform_device *pdev) struct aspeed_reset *ar; struct regmap *map; struct clk_hw *hw; - u32 val, rate; -+ u32 val, uart_clock_div; ++ u32 val, rate, rate_hi; int i, ret; map = syscon_node_to_regmap(dev->of_node); -@@ -481,15 +489,23 @@ static int aspeed_clk_probe(struct platform_device *pdev) +@@ -420,16 +428,25 @@ static int aspeed_clk_probe(struct platform_device *pdev) + /* UART clock div13 setting */ regmap_read(map, ASPEED_MISC_CTRL, &val); - if (val & UART_DIV13_EN) +- if (val & UART_DIV13_EN) - rate = 24000000 / 13; -+ uart_clock_div = 13; - else +- else - rate = 24000000; -+ uart_clock_div = 1; -+ ++ if (val & UART_DIV13_EN) { ++ rate = UART_LOW_SPEED_CLK / 13; ++ rate_hi = UART_HIGH_SPEED_CLK / 13; ++ } else { ++ rate = UART_LOW_SPEED_CLK; ++ rate_hi = UART_HIGH_SPEED_CLK; ++ } /* TODO: Find the parent data for the uart clock */ -- hw = clk_hw_register_fixed_rate(dev, "uart", NULL, 0, rate); -+ hw = clk_hw_register_fixed_rate(dev, "uart", NULL, 0, -+ UART_LOW_SPEED_CLK / uart_clock_div); + hw = clk_hw_register_fixed_rate(dev, "uart", NULL, 0, rate); if (IS_ERR(hw)) return PTR_ERR(hw); aspeed_clk_data->hws[ASPEED_CLK_UART] = hw; + hw = clk_hw_register_fixed_rate(dev, "uart-hs", "usb-port1-gate", 0, -+ UART_HIGH_SPEED_CLK / uart_clock_div); ++ rate_hi); + if (IS_ERR(hw)) + return PTR_ERR(hw); + aspeed_clk_data->hws[ASPEED_CLK_UART_HS] = hw; @@ -82,7 +85,7 @@ index 42b4df6ba249..97c27820db3e 100644 /* * Memory controller (M-PLL) PLL. This clock is configured by the * bootloader, and is exposed to Linux as a read-only clock rate. -@@ -570,9 +586,22 @@ static int aspeed_clk_probe(struct platform_device *pdev) +@@ -539,9 +556,22 @@ static int aspeed_clk_probe(struct platform_device *pdev) * UART[1..5] clock source mux */ @@ -105,7 +108,7 @@ index 42b4df6ba249..97c27820db3e 100644 /* Special case: the USB port 1 clock (bit 14) is always * working the opposite way from the other ones. -@@ -580,7 +609,7 @@ static int aspeed_clk_probe(struct platform_device *pdev) +@@ -549,7 +579,7 @@ static int aspeed_clk_probe(struct platform_device *pdev) gate_flags = (gd->clock_idx == 14) ? 0 : CLK_GATE_SET_TO_DISABLE; hw = aspeed_clk_hw_register_gate(dev, gd->name, @@ -115,15 +118,15 @@ index 42b4df6ba249..97c27820db3e 100644 map, gd->clock_idx, diff --git a/include/dt-bindings/clock/aspeed-clock.h b/include/dt-bindings/clock/aspeed-clock.h -index f43738607d77..335879505a72 100644 +index 64e245fb113f..df2f9fdfe5c1 100644 --- a/include/dt-bindings/clock/aspeed-clock.h +++ b/include/dt-bindings/clock/aspeed-clock.h -@@ -39,6 +39,8 @@ - #define ASPEED_CLK_BCLK 33 - #define ASPEED_CLK_MPLL 34 +@@ -41,6 +41,8 @@ #define ASPEED_CLK_24M 35 -+#define ASPEED_CLK_UART_HS 36 -+#define ASPEED_CLK_MAX 37 + #define ASPEED_CLK_GATE_MAC1RCLK 36 + #define ASPEED_CLK_GATE_MAC2RCLK 37 ++#define ASPEED_CLK_UART_HS 38 ++#define ASPEED_CLK_MAX 39 #define ASPEED_RESET_XDMA 0 #define ASPEED_RESET_MCTP 1 diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0032-misc-aspeed-Add-Aspeed-UART-routing-control-driver.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0032-misc-aspeed-Add-Aspeed-UART-routing-control-driver.patch index 8c18e87ef..82e90c059 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0032-misc-aspeed-Add-Aspeed-UART-routing-control-driver.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0032-misc-aspeed-Add-Aspeed-UART-routing-control-driver.patch @@ -1,4 +1,4 @@ -From 0928704f3b593217662f980221406fcf6db39377 Mon Sep 17 00:00:00 2001 +From af686df07d23080834332b63fe37ee28b630ca2f Mon Sep 17 00:00:00 2001 From: Oskar Senft <osk@google.com> Date: Wed, 8 Aug 2018 10:15:05 -0400 Subject: [PATCH] misc: aspeed: Add Aspeed UART routing control driver. @@ -102,10 +102,10 @@ index 000000000000..afaf17cb7eda +$ cat /sys/bus/platform/drivers/aspeed-uart-routing/*.uart_routing/uart1 +io1 io2 io3 io4 uart2 [uart3] uart4 io6 diff --git a/arch/arm/boot/dts/aspeed-bmc-intel-purley.dts b/arch/arm/boot/dts/aspeed-bmc-intel-purley.dts -index 4815104459f1..3094e90c9def 100644 +index 0aa2ac82cae4..403f29a74281 100644 --- a/arch/arm/boot/dts/aspeed-bmc-intel-purley.dts +++ b/arch/arm/boot/dts/aspeed-bmc-intel-purley.dts -@@ -233,6 +233,10 @@ +@@ -260,6 +260,10 @@ status = "okay"; }; @@ -117,10 +117,10 @@ index 4815104459f1..3094e90c9def 100644 status = "okay"; diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index 0e7f1d2fa08e..6e0b40eb939f 100644 +index 26671cc4dbd5..8288002e4f02 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -493,6 +493,12 @@ +@@ -524,6 +524,12 @@ status = "disabled"; }; }; @@ -134,10 +134,10 @@ index 0e7f1d2fa08e..6e0b40eb939f 100644 peci: bus@1e78b000 { diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig -index b6acddaa9421..78e8fc892209 100644 +index 50814caba1d3..439f3b0de702 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig -@@ -481,6 +481,12 @@ config ASPEED_ESPI_SLAVE +@@ -463,6 +463,12 @@ config ASPEED_ESPI_SLAVE Control Aspeed ast2500 eSPI slave controller to handle event which needs the firmware's processing. @@ -151,10 +151,10 @@ index b6acddaa9421..78e8fc892209 100644 depends on PCI select CRC32 diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile -index f91f66a15484..7337b8bcd0a3 100644 +index f168e6713440..87958cb74d00 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile -@@ -55,6 +55,7 @@ obj-$(CONFIG_ECHO) += echo/ +@@ -54,6 +54,7 @@ obj-$(CONFIG_ECHO) += echo/ obj-$(CONFIG_VEXPRESS_SYSCFG) += vexpress-syscfg.o obj-$(CONFIG_CXL_BASE) += cxl/ obj-$(CONFIG_ASPEED_ESPI_SLAVE) += aspeed-espi-slave.o diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0034-arm-dts-aspeed-Swap-the-mac-nodes-numbering.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0034-arm-dts-aspeed-Swap-the-mac-nodes-numbering.patch index 7f556de64..08f406ac1 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0034-arm-dts-aspeed-Swap-the-mac-nodes-numbering.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0034-arm-dts-aspeed-Swap-the-mac-nodes-numbering.patch @@ -1,4 +1,4 @@ -From fcea191a6e0eb869c62b5d1ea8a6e914a540fcfb Mon Sep 17 00:00:00 2001 +From 89112c3971a540302834e5e987a1dec236bd752d Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo <jae.hyun.yoo@intel.com> Date: Wed, 3 Oct 2018 10:17:58 -0700 Subject: [PATCH] arm: dts: aspeed: Swap the mac nodes numbering @@ -13,10 +13,10 @@ Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi b/arch/arm/boot/dts/aspeed-g4.dtsi -index 3df43f925848..618abeab539b 100644 +index 71563972d2fe..78251541a109 100644 --- a/arch/arm/boot/dts/aspeed-g4.dtsi +++ b/arch/arm/boot/dts/aspeed-g4.dtsi -@@ -101,14 +101,6 @@ +@@ -121,14 +121,6 @@ reg = <0x1e6c2000 0x80>; }; @@ -31,7 +31,7 @@ index 3df43f925848..618abeab539b 100644 mac1: ethernet@1e680000 { compatible = "aspeed,ast2400-mac", "faraday,ftgmac100"; reg = <0x1e680000 0x180>; -@@ -117,6 +109,14 @@ +@@ -137,6 +129,14 @@ status = "disabled"; }; @@ -47,7 +47,7 @@ index 3df43f925848..618abeab539b 100644 compatible = "aspeed,ast2400-ehci", "generic-ehci"; reg = <0x1e6a1000 0x100>; diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index 6e0b40eb939f..b8c85fad2a39 100644 +index 8288002e4f02..6d2c4494ce04 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi @@ -149,14 +149,6 @@ diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0039-Add-Aspeed-PWM-driver-which-uses-FTTMR010-timer-IP.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0039-Add-Aspeed-PWM-driver-which-uses-FTTMR010-timer-IP.patch index c115d23d0..6d8ec4883 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0039-Add-Aspeed-PWM-driver-which-uses-FTTMR010-timer-IP.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0039-Add-Aspeed-PWM-driver-which-uses-FTTMR010-timer-IP.patch @@ -1,4 +1,4 @@ -From 7ac4709dd92c608ca4c8ff0046a434c8f465a80c Mon Sep 17 00:00:00 2001 +From e2df269568c6c0c8c8edbca73118c2dbdaea75bd Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo <jae.hyun.yoo@intel.com> Date: Mon, 11 Feb 2019 17:02:35 -0800 Subject: [PATCH] Add Aspeed PWM driver which uses FTTMR010 timer IP @@ -18,10 +18,10 @@ Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> create mode 100644 drivers/pwm/pwm-fttmr010.c diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index b8c85fad2a39..88ac8e08b6ae 100644 +index 6d2c4494ce04..653e03a0fa4c 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -312,7 +312,7 @@ +@@ -342,7 +342,7 @@ timer: timer@1e782000 { /* This timer is a Faraday FTTMR010 derivative */ @@ -31,7 +31,7 @@ index b8c85fad2a39..88ac8e08b6ae 100644 interrupts = <16 17 18 35 36 37 38 39>; clocks = <&syscon ASPEED_CLK_APB>; diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig -index dff5a93f7daa..5759439a3947 100644 +index a7e57516959e..3388f837fcf9 100644 --- a/drivers/pwm/Kconfig +++ b/drivers/pwm/Kconfig @@ -171,6 +171,15 @@ config PWM_FSL_FTM @@ -51,7 +51,7 @@ index dff5a93f7daa..5759439a3947 100644 tristate "HiSilicon BVT PWM support" depends on ARCH_HISI || COMPILE_TEST diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile -index c368599d36c0..937d212bb02a 100644 +index 76b555b51887..19ecfd82d8c5 100644 --- a/drivers/pwm/Makefile +++ b/drivers/pwm/Makefile @@ -15,6 +15,7 @@ obj-$(CONFIG_PWM_CRC) += pwm-crc.o diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0040-i2c-Add-mux-hold-unhold-msg-types.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0040-i2c-Add-mux-hold-unhold-msg-types.patch index b2057d247..ce77494f4 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0040-i2c-Add-mux-hold-unhold-msg-types.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0040-i2c-Add-mux-hold-unhold-msg-types.patch @@ -1,4 +1,4 @@ -From ed13e7eb07e6cb8bdc1eb4563de30b469a9beb26 Mon Sep 17 00:00:00 2001 +From be693c1c21979c067623434aa653f85a83c8eac7 Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo <jae.hyun.yoo@intel.com> Date: Fri, 15 Feb 2019 16:05:09 -0800 Subject: [PATCH] i2c: Add mux hold/unhold msg types @@ -48,7 +48,7 @@ Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> 6 files changed, 214 insertions(+), 16 deletions(-) diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c -index 9e43508d4567..8a480d269542 100644 +index 9c440fa6a3dd..53ff27cae5d3 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c @@ -1299,6 +1299,25 @@ int i2c_handle_smbus_host_notify(struct i2c_adapter *adap, unsigned short addr) @@ -100,7 +100,7 @@ index 9e43508d4567..8a480d269542 100644 */ int __i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) { -+ enum i2c_hold_msg_type hold_msg; ++ enum i2c_hold_msg_type hold_msg = I2C_HOLD_MSG_NONE; unsigned long orig_jiffies; + unsigned long timeout; int ret, try; @@ -219,18 +219,18 @@ index 3ac426a8ab5a..f7bf95101e34 100644 return res; } diff --git a/drivers/i2c/i2c-mux.c b/drivers/i2c/i2c-mux.c -index 603252fa1284..d3f55243e701 100644 +index 774507b54b57..c6e433238b22 100644 --- a/drivers/i2c/i2c-mux.c +++ b/drivers/i2c/i2c-mux.c -@@ -26,6 +26,7 @@ - #include <linux/module.h> +@@ -27,6 +27,7 @@ #include <linux/of.h> #include <linux/slab.h> + #include <linux/sysfs.h> +#include <linux/timer.h> /* multiplexer per channel data */ struct i2c_mux_priv { -@@ -35,21 +36,57 @@ struct i2c_mux_priv { +@@ -36,21 +37,57 @@ struct i2c_mux_priv { u32 chan_id; }; @@ -290,7 +290,7 @@ index 603252fa1284..d3f55243e701 100644 return ret; } -@@ -60,15 +97,32 @@ static int i2c_mux_master_xfer(struct i2c_adapter *adap, +@@ -61,15 +98,32 @@ static int i2c_mux_master_xfer(struct i2c_adapter *adap, struct i2c_mux_priv *priv = adap->algo_data; struct i2c_mux_core *muxc = priv->muxc; struct i2c_adapter *parent = muxc->parent; @@ -325,7 +325,7 @@ index 603252fa1284..d3f55243e701 100644 return ret; } -@@ -81,16 +135,33 @@ static int __i2c_mux_smbus_xfer(struct i2c_adapter *adap, +@@ -82,16 +136,33 @@ static int __i2c_mux_smbus_xfer(struct i2c_adapter *adap, struct i2c_mux_priv *priv = adap->algo_data; struct i2c_mux_core *muxc = priv->muxc; struct i2c_adapter *parent = muxc->parent; @@ -361,7 +361,7 @@ index 603252fa1284..d3f55243e701 100644 return ret; } -@@ -103,16 +174,33 @@ static int i2c_mux_smbus_xfer(struct i2c_adapter *adap, +@@ -104,16 +175,33 @@ static int i2c_mux_smbus_xfer(struct i2c_adapter *adap, struct i2c_mux_priv *priv = adap->algo_data; struct i2c_mux_core *muxc = priv->muxc; struct i2c_adapter *parent = muxc->parent; @@ -431,10 +431,10 @@ index c5a977320f82..47f8763d6ed2 100644 int max_adapters; struct i2c_adapter *adapter[0]; diff --git a/include/linux/i2c.h b/include/linux/i2c.h -index 1308126fc384..3ee92c6a442d 100644 +index fa5552c2307b..92c795ce9081 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h -@@ -699,6 +699,13 @@ struct i2c_adapter { +@@ -711,6 +711,13 @@ struct i2c_adapter { const struct i2c_adapter_quirks *quirks; struct irq_domain *host_notify_domain; @@ -448,7 +448,7 @@ index 1308126fc384..3ee92c6a442d 100644 }; #define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev) -@@ -998,4 +1005,22 @@ static inline struct i2c_client *i2c_acpi_new_device(struct device *dev, +@@ -1005,4 +1012,22 @@ static inline struct i2c_adapter *i2c_acpi_find_adapter_by_handle(acpi_handle ha } #endif /* CONFIG_ACPI */ diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0042-Add-bus-timeout-ms-and-retries-device-tree-propertie.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0042-Add-bus-timeout-ms-and-retries-device-tree-propertie.patch index 25f494652..0a9bccf23 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0042-Add-bus-timeout-ms-and-retries-device-tree-propertie.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0042-Add-bus-timeout-ms-and-retries-device-tree-propertie.patch @@ -1,4 +1,4 @@ -From c55d6bb49cfbd39a7c0848076c84166def65936e Mon Sep 17 00:00:00 2001 +From 04af6987c904225fdd4657e7b87874edd11c4e0b Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo <jae.hyun.yoo@intel.com> Date: Thu, 7 Mar 2019 15:17:40 -0800 Subject: [PATCH] Add bus-timeout-ms and #retries device tree properties @@ -59,10 +59,10 @@ index 44efafdfd7f5..e382931cf3d6 100644 used by the device. I2C core will assign "irq" interrupt (or the very first interrupt if not using interrupt names) as primary interrupt for the slave. diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c -index 434b753def3b..99bd30953531 100644 +index e1719b1f2020..58bdbe472721 100644 --- a/drivers/i2c/busses/i2c-aspeed.c +++ b/drivers/i2c/busses/i2c-aspeed.c -@@ -1014,7 +1014,6 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) +@@ -1018,7 +1018,6 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) spin_lock_init(&bus->lock); init_completion(&bus->cmd_complete); bus->adap.owner = THIS_MODULE; @@ -71,7 +71,7 @@ index 434b753def3b..99bd30953531 100644 bus->adap.dev.parent = &pdev->dev; bus->adap.dev.of_node = pdev->dev.of_node; diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c -index 8a480d269542..69b798a2d31e 100644 +index 302d2d0c87d0..825e2d85d5a7 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c @@ -1320,6 +1320,7 @@ static void i2c_adapter_hold_timer_callback(struct timer_list *t) diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0043-char-ipmi-Add-clock-control-logic-into-Aspeed-LPC-BT.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0043-char-ipmi-Add-clock-control-logic-into-Aspeed-LPC-BT.patch index 035945cf3..139d06df0 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0043-char-ipmi-Add-clock-control-logic-into-Aspeed-LPC-BT.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0043-char-ipmi-Add-clock-control-logic-into-Aspeed-LPC-BT.patch @@ -1,4 +1,4 @@ -From c4e7b89ee20dc28e10fae7eb0859e4fa9d3e8643 Mon Sep 17 00:00:00 2001 +From 4d90c5ba05ee3e8a4bf5e4c1a5fdcf2664b1800b Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo <jae.hyun.yoo@intel.com> Date: Wed, 13 Mar 2019 15:04:16 -0700 Subject: [PATCH] char: ipmi: Add clock control logic into Aspeed LPC BT driver @@ -42,10 +42,10 @@ index 028268fd99ee..d13887d60f19 100644 + clocks = <&syscon ASPEED_CLK_GATE_LCLK>; }; diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi b/arch/arm/boot/dts/aspeed-g4.dtsi -index 618abeab539b..c2388bb7c678 100644 +index 78251541a109..b3b6720fb6fb 100644 --- a/arch/arm/boot/dts/aspeed-g4.dtsi +++ b/arch/arm/boot/dts/aspeed-g4.dtsi -@@ -337,6 +337,7 @@ +@@ -387,6 +387,7 @@ ibt: ibt@c0 { compatible = "aspeed,ast2400-ibt-bmc"; reg = <0xc0 0x18>; @@ -54,10 +54,10 @@ index 618abeab539b..c2388bb7c678 100644 status = "disabled"; }; diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index 88ac8e08b6ae..88b318fd287b 100644 +index 653e03a0fa4c..49f792eafdd1 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -470,6 +470,7 @@ +@@ -500,6 +500,7 @@ ibt: ibt@c0 { compatible = "aspeed,ast2500-ibt-bmc"; reg = <0xc0 0x18>; diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0044-misc-Add-clock-control-logic-into-Aspeed-LPC-SNOOP-d.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0044-misc-Add-clock-control-logic-into-Aspeed-LPC-SNOOP-d.patch index c335fb3ec..cd20e77ac 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0044-misc-Add-clock-control-logic-into-Aspeed-LPC-SNOOP-d.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0044-misc-Add-clock-control-logic-into-Aspeed-LPC-SNOOP-d.patch @@ -1,4 +1,4 @@ -From a5bbf0f5943d3a6be6e58a4b78d6d18694ceb859 Mon Sep 17 00:00:00 2001 +From f2e7fb51e4832a0da2fdb8fb267471b54581312b Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo <jae.hyun.yoo@intel.com> Date: Wed, 13 Mar 2019 15:27:48 -0700 Subject: [PATCH] misc: Add clock control logic into Aspeed LPC SNOOP driver @@ -22,10 +22,10 @@ Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi b/arch/arm/boot/dts/aspeed-g4.dtsi -index c2388bb7c678..70aca75d65e0 100644 +index b3b6720fb6fb..58c5148194a3 100644 --- a/arch/arm/boot/dts/aspeed-g4.dtsi +++ b/arch/arm/boot/dts/aspeed-g4.dtsi -@@ -320,6 +320,7 @@ +@@ -370,6 +370,7 @@ compatible = "aspeed,ast2400-lpc-snoop"; reg = <0x0 0x80>; interrupts = <8>; @@ -34,10 +34,10 @@ index c2388bb7c678..70aca75d65e0 100644 }; diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index 88b318fd287b..f4a5d06f1000 100644 +index 49f792eafdd1..955789d8c736 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -453,6 +453,7 @@ +@@ -483,6 +483,7 @@ compatible = "aspeed,ast2500-lpc-snoop"; reg = <0x0 0x80>; interrupts = <8>; diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0045-char-ipmi-Add-clock-control-logic-into-Aspeed-LPC-KC.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0045-char-ipmi-Add-clock-control-logic-into-Aspeed-LPC-KC.patch index 499662ac3..cfff0a842 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0045-char-ipmi-Add-clock-control-logic-into-Aspeed-LPC-KC.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0045-char-ipmi-Add-clock-control-logic-into-Aspeed-LPC-KC.patch @@ -1,4 +1,4 @@ -From 27675470115548612cee9153903aaffffb68177b Mon Sep 17 00:00:00 2001 +From 9a6eafbba9f5d972065f65431093ec74968cae39 Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo <jae.hyun.yoo@intel.com> Date: Wed, 13 Mar 2019 15:36:34 -0700 Subject: [PATCH] char: ipmi: Add clock control logic into Aspeed LPC KCS @@ -45,10 +45,10 @@ index d98a9bf45d6c..3453eb0bf8f2 100644 kcs_addr = <0xCA2>; status = "okay"; diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi b/arch/arm/boot/dts/aspeed-g4.dtsi -index 1c00828da913..f04006f4cd27 100644 +index 58c5148194a3..14e5dc260a3b 100644 --- a/arch/arm/boot/dts/aspeed-g4.dtsi +++ b/arch/arm/boot/dts/aspeed-g4.dtsi -@@ -298,6 +298,33 @@ +@@ -348,6 +348,33 @@ lpc_bmc: lpc-bmc@0 { compatible = "aspeed,ast2400-lpc-bmc"; reg = <0x0 0x80>; @@ -82,7 +82,7 @@ index 1c00828da913..f04006f4cd27 100644 }; lpc_host: lpc-host@80 { -@@ -309,6 +336,14 @@ +@@ -359,6 +386,14 @@ #size-cells = <1>; ranges = <0x0 0x80 0x1e0>; @@ -98,7 +98,7 @@ index 1c00828da913..f04006f4cd27 100644 compatible = "aspeed,ast2400-lpc-ctrl"; reg = <0x0 0x80>; diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index f2292bdfef91..d46b9ffc79de 100644 +index 955789d8c736..19739183c1c8 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi @@ -135,7 +135,7 @@ @@ -110,7 +110,7 @@ index f2292bdfef91..d46b9ffc79de 100644 interrupt-controller; #interrupt-cells = <1>; valid-sources = <0xfefff7ff 0x0807ffff>; -@@ -410,18 +410,21 @@ +@@ -440,18 +440,21 @@ compatible = "aspeed,ast2500-kcs-bmc"; interrupts = <8>; kcs_chan = <1>; @@ -132,7 +132,7 @@ index f2292bdfef91..d46b9ffc79de 100644 status = "disabled"; }; }; -@@ -439,6 +442,7 @@ +@@ -469,6 +472,7 @@ compatible = "aspeed,ast2500-kcs-bmc"; interrupts = <8>; kcs_chan = <4>; diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0049-Suppress-excessive-HID-gadget-error-logs.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0049-Suppress-excessive-HID-gadget-error-logs.patch index d0f98b9c1..4a87f2d76 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0049-Suppress-excessive-HID-gadget-error-logs.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0049-Suppress-excessive-HID-gadget-error-logs.patch @@ -1,4 +1,4 @@ -From 7dd0a7c62e5885bb726ef2bd5007e79a50932c38 Mon Sep 17 00:00:00 2001 +From 5b9ec5081492b461710cb82e7ecc93fd3af8ad34 Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo <jae.hyun.yoo@intel.com> Date: Mon, 18 Mar 2019 14:06:36 -0700 Subject: [PATCH] Suppress excessive HID gadget error logs @@ -18,13 +18,22 @@ This should be a downstream only customization. Do not upstream it. Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> --- - drivers/usb/gadget/function/f_hid.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) + drivers/usb/gadget/function/f_hid.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/usb/gadget/function/f_hid.c b/drivers/usb/gadget/function/f_hid.c -index f3816a5c861e..3a94584a9dbc 100644 +index f3816a5c861e..c96c0f6f1df0 100644 --- a/drivers/usb/gadget/function/f_hid.c +++ b/drivers/usb/gadget/function/f_hid.c +@@ -320,7 +320,7 @@ static void f_hidg_req_complete(struct usb_ep *ep, struct usb_request *req) + struct f_hidg *hidg = (struct f_hidg *)ep->driver_data; + unsigned long flags; + +- if (req->status != 0) { ++ if (req->status != 0 && req->status != -ESHUTDOWN) { + ERROR(hidg->func.config->cdev, + "End Point Request ERROR: %d\n", req->status); + } @@ -395,8 +395,10 @@ static ssize_t f_hidg_write(struct file *file, const char __user *buffer, status = usb_ep_queue(hidg->in_ep, req, GFP_ATOMIC); diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0051-Add-AST2500-JTAG-device.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0051-Add-AST2500-JTAG-device.patch index d9379f565..02bb6527f 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0051-Add-AST2500-JTAG-device.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0051-Add-AST2500-JTAG-device.patch @@ -1,4 +1,4 @@ -From 278740d23c1eac792c64608af4bfa3fae640965f Mon Sep 17 00:00:00 2001 +From ce35414258a8541a8b81a4a8a929bcf9cdface97 Mon Sep 17 00:00:00 2001 From: "Hunt, Bryan" <bryan.hunt@intel.com> Date: Mon, 6 May 2019 10:02:14 -0700 Subject: [PATCH] Add AST2500d JTAG driver @@ -11,10 +11,10 @@ Signed-off-by: Hunt, Bryan <bryan.hunt@intel.com> 1 file changed, 9 insertions(+) diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index ed0b7217f55f..89a9febf6f14 100644 +index 19739183c1c8..3d615708a0cd 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -389,6 +389,15 @@ +@@ -419,6 +419,15 @@ pinctrl-0 = <&pinctrl_espi_default>; }; diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0052-drivers-jtag-Add-JTAG-core-driver.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0052-drivers-jtag-Add-JTAG-core-driver.patch index 3047746ca..4162046e7 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0052-drivers-jtag-Add-JTAG-core-driver.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0052-drivers-jtag-Add-JTAG-core-driver.patch @@ -1,4 +1,4 @@ -From 520416545a47cffe66815f31bc1465eab8864554 Mon Sep 17 00:00:00 2001 +From 45dd8ca9bb83b688aa0d0b5472fd0b1ed9fcf29a Mon Sep 17 00:00:00 2001 From: "Corona, Ernesto" <ernesto.corona@intel.com> Date: Fri, 7 Jun 2019 07:37:39 -0800 Subject: [PATCH v29 1/6] drivers: jtag: Add JTAG core driver @@ -267,20 +267,20 @@ Comments pointed by Tobias Klauser <tklauser@distanz.ch> create mode 100644 include/uapi/linux/jtag.h diff --git a/drivers/Kconfig b/drivers/Kconfig -index 339ac306ded6..fb970bbe6b03 100644 +index 92f4a9bb83f1..7403af7ffa85 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig -@@ -234,4 +234,5 @@ source "drivers/counter/Kconfig" +@@ -232,4 +232,5 @@ source "drivers/counter/Kconfig" source "drivers/peci/Kconfig" +source "drivers/jtag/Kconfig" endmenu diff --git a/drivers/Makefile b/drivers/Makefile -index 18d91cd5ac0f..b4d21c963923 100644 +index 47cad1b9f992..cd240910c56e 100644 --- a/drivers/Makefile +++ b/drivers/Makefile -@@ -189,3 +189,4 @@ obj-$(CONFIG_GNSS) += gnss/ +@@ -188,3 +188,4 @@ obj-$(CONFIG_GNSS) += gnss/ obj-$(CONFIG_INTERCONNECT) += interconnect/ obj-$(CONFIG_COUNTER) += counter/ obj-$(CONFIG_PECI) += peci/ diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0056-Documentation-jtag-Add-JTAG-core-driver-ioctl-number.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0056-Documentation-jtag-Add-JTAG-core-driver-ioctl-number.patch index a7dccc4b6..3efe2c5f3 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0056-Documentation-jtag-Add-JTAG-core-driver-ioctl-number.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0056-Documentation-jtag-Add-JTAG-core-driver-ioctl-number.patch @@ -1,7 +1,7 @@ -From ba0c35ae070cffcb384fc76e23a38e00142b128d Mon Sep 17 00:00:00 2001 +From d5efb0ec2b28bc1074472ab4eaa937dcbe490f6a Mon Sep 17 00:00:00 2001 From: "Corona, Ernesto" <ernesto.corona@intel.com> -Date: Wed, 10 Mar 2019 11:48:18 -0800 -Subject: [PATCH v29 5/6] Documentation jtag: Add JTAG core driver ioctl number +Date: Sun, 10 Mar 2019 11:48:18 -0800 +Subject: [PATCH] Documentation jtag: Add JTAG core driver ioctl number JTAG class driver provide infrastructure to support hardware/software JTAG platform drivers. It provide user layer API interface for flashing @@ -36,22 +36,22 @@ Cc: Arnd Bergmann <arnd@arndb.de> Cc: Steven A Filary <steven.a.filary@intel.com> Cc: Bryan Hunt <bryan.hunt@intel.com> --- - Documentation/ioctl/ioctl-number.txt | 2 ++ + Documentation/ioctl/ioctl-number.rst | 2 ++ 1 file changed, 2 insertions(+) -diff --git a/Documentation/ioctl/ioctl-number.txt b/Documentation/ioctl/ioctl-number.txt -index c955814..f732118 100644 ---- a/Documentation/ioctl/ioctl-number.txt -+++ b/Documentation/ioctl/ioctl-number.txt -@@ -323,6 +323,8 @@ Code Seq#(hex) Include File Comments - 0xB0 all RATIO devices in development: - <mailto:vgo@ratio.de> - 0xB1 00-1F PPPoX <mailto:mostrows@styx.uwaterloo.ca> -+0xB2 00-0F linux/jtag.h JTAG driver -+ <mailto:oleksandrs@mellanox.com> - 0xB3 00 linux/mmc/ioctl.h - 0xB4 00-0F linux/gpio.h <mailto:linux-gpio@vger.kernel.org> - 0xB5 00-0F uapi/linux/rpmsg.h <mailto:linux-remoteproc@vger.kernel.org> +diff --git a/Documentation/ioctl/ioctl-number.rst b/Documentation/ioctl/ioctl-number.rst +index 7f8dcae7a230..4d25966d44e5 100644 +--- a/Documentation/ioctl/ioctl-number.rst ++++ b/Documentation/ioctl/ioctl-number.rst +@@ -332,6 +332,8 @@ Code Seq# Include File Comments + <mailto:vgo@ratio.de> + 0xB1 00-1F PPPoX + <mailto:mostrows@styx.uwaterloo.ca> ++0xB2 00-0F linux/jtag.h JTAG driver ++ <mailto:oleksandrs@mellanox.com> + 0xB3 00 linux/mmc/ioctl.h + 0xB4 00-0F linux/gpio.h <mailto:linux-gpio@vger.kernel.org> + 0xB5 00-0F uapi/linux/rpmsg.h <mailto:linux-remoteproc@vger.kernel.org> -- 2.7.4 diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0057-drivers-jtag-Add-JTAG-core-driver-Maintainers.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0057-drivers-jtag-Add-JTAG-core-driver-Maintainers.patch index 47a532590..b5f5a93a0 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0057-drivers-jtag-Add-JTAG-core-driver-Maintainers.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0057-drivers-jtag-Add-JTAG-core-driver-Maintainers.patch @@ -1,4 +1,4 @@ -From 8598b57423967f5851484533a1b09a04bafa235b Mon Sep 17 00:00:00 2001 +From 01fc94b1193f4e97d498e2bcb05dfe21b991b01d Mon Sep 17 00:00:00 2001 From: "Corona, Ernesto" <ernesto.corona@intel.com> Date: Sun, 10 Mar 2019 11:49:37 -0800 Subject: [PATCH v29 6/6] drivers: jtag: Add JTAG core driver Maintainers @@ -24,10 +24,10 @@ Cc: Bryan Hunt <bryan.hunt@intel.com> 1 file changed, 11 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS -index e0925f221e25..2cd0a46f9a1a 100644 +index f5c5eaa69f2f..92b0932c4b9f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -8521,6 +8521,17 @@ L: linux-serial@vger.kernel.org +@@ -8709,6 +8709,17 @@ L: linux-serial@vger.kernel.org S: Orphan F: drivers/tty/serial/jsm/ diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0060-i2c-aspeed-fix-master-pending-state-handling.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0060-i2c-aspeed-fix-master-pending-state-handling.patch new file mode 100644 index 000000000..d38c089af --- /dev/null +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0060-i2c-aspeed-fix-master-pending-state-handling.patch @@ -0,0 +1,135 @@ +From ca5e5e784ada4da11caebf6ba6852e1ff8a13bf7 Mon Sep 17 00:00:00 2001 +From: Jae Hyun Yoo <jae.hyun.yoo@intel.com> +Date: Tue, 11 Jun 2019 14:59:53 -0700 +Subject: [PATCH] i2c: aspeed: fix master pending state handling + +In case of master pending state, it should not trigger a master +command, otherwise data could be corrupted because this H/W shares +the same data buffer for slave and master operations. It also means +that H/W command queue handling is unreliable because of the buffer +sharing issue. To fix this issue, it clears command queue if a +master command is queued in pending state to use S/W solution +instead of H/W command queue handling. Also, it refines restarting +mechanism of the pending master command. + +Fixes: 2e57b7cebb98 ("i2c: aspeed: Add multi-master use case support") + +Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> +--- + drivers/i2c/busses/i2c-aspeed.c | 54 ++++++++++++++++++++++++++--------------- + 1 file changed, 34 insertions(+), 20 deletions(-) + +diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c +index 58bdbe472721..7becfcd67142 100644 +--- a/drivers/i2c/busses/i2c-aspeed.c ++++ b/drivers/i2c/busses/i2c-aspeed.c +@@ -108,6 +108,12 @@ + #define ASPEED_I2CD_S_TX_CMD BIT(2) + #define ASPEED_I2CD_M_TX_CMD BIT(1) + #define ASPEED_I2CD_M_START_CMD BIT(0) ++#define ASPEED_I2CD_MASTER_CMDS_MASK \ ++ (ASPEED_I2CD_M_STOP_CMD | \ ++ ASPEED_I2CD_M_S_RX_CMD_LAST | \ ++ ASPEED_I2CD_M_RX_CMD | \ ++ ASPEED_I2CD_M_TX_CMD | \ ++ ASPEED_I2CD_M_START_CMD) + + /* 0x18 : I2CD Slave Device Address Register */ + #define ASPEED_I2CD_DEV_ADDR_MASK GENMASK(6, 0) +@@ -351,18 +357,19 @@ static void aspeed_i2c_do_start(struct aspeed_i2c_bus *bus) + struct i2c_msg *msg = &bus->msgs[bus->msgs_index]; + u8 slave_addr = i2c_8bit_addr_from_msg(msg); + +- bus->master_state = ASPEED_I2C_MASTER_START; +- + #if IS_ENABLED(CONFIG_I2C_SLAVE) + /* + * If it's requested in the middle of a slave session, set the master + * state to 'pending' then H/W will continue handling this master + * command when the bus comes back to the idle state. + */ +- if (bus->slave_state != ASPEED_I2C_SLAVE_INACTIVE) ++ if (bus->slave_state != ASPEED_I2C_SLAVE_INACTIVE) { + bus->master_state = ASPEED_I2C_MASTER_PENDING; ++ return; ++ } + #endif /* CONFIG_I2C_SLAVE */ + ++ bus->master_state = ASPEED_I2C_MASTER_START; + bus->buf_index = 0; + + if (msg->flags & I2C_M_RD) { +@@ -437,20 +444,6 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) + } + } + +-#if IS_ENABLED(CONFIG_I2C_SLAVE) +- /* +- * A pending master command will be started by H/W when the bus comes +- * back to idle state after completing a slave operation so change the +- * master state from 'pending' to 'start' at here if slave is inactive. +- */ +- if (bus->master_state == ASPEED_I2C_MASTER_PENDING) { +- if (bus->slave_state != ASPEED_I2C_SLAVE_INACTIVE) +- goto out_no_complete; +- +- bus->master_state = ASPEED_I2C_MASTER_START; +- } +-#endif /* CONFIG_I2C_SLAVE */ +- + /* Master is not currently active, irq was for someone else. */ + if (bus->master_state == ASPEED_I2C_MASTER_INACTIVE || + bus->master_state == ASPEED_I2C_MASTER_PENDING) +@@ -477,11 +470,15 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) + #if IS_ENABLED(CONFIG_I2C_SLAVE) + /* + * If a peer master starts a xfer immediately after it queues a +- * master command, change its state to 'pending' then H/W will +- * continue the queued master xfer just after completing the +- * slave mode session. ++ * master command, clear the queued master command and change ++ * its state to 'pending'. To simplify handling of pending ++ * cases, it uses S/W solution instead of H/W command queue ++ * handling. + */ + if (unlikely(irq_status & ASPEED_I2CD_INTR_SLAVE_MATCH)) { ++ writel(readl(bus->base + ASPEED_I2C_CMD_REG) & ++ ~ASPEED_I2CD_MASTER_CMDS_MASK, ++ bus->base + ASPEED_I2C_CMD_REG); + bus->master_state = ASPEED_I2C_MASTER_PENDING; + dev_dbg(bus->dev, + "master goes pending due to a slave start\n"); +@@ -644,6 +641,14 @@ static irqreturn_t aspeed_i2c_bus_irq(int irq, void *dev_id) + irq_handled |= aspeed_i2c_master_irq(bus, + irq_remaining); + } ++ ++ /* ++ * Start a pending master command at here if a slave operation is ++ * completed. ++ */ ++ if (bus->master_state == ASPEED_I2C_MASTER_PENDING && ++ bus->slave_state == ASPEED_I2C_SLAVE_INACTIVE) ++ aspeed_i2c_do_start(bus); + #else + irq_handled = aspeed_i2c_master_irq(bus, irq_remaining); + #endif /* CONFIG_I2C_SLAVE */ +@@ -707,6 +712,15 @@ static int aspeed_i2c_master_xfer(struct i2c_adapter *adap, + ASPEED_I2CD_BUS_BUSY_STS)) + aspeed_i2c_recover_bus(bus); + ++ /* ++ * If timed out and the state is still pending, drop the pending ++ * master command. ++ */ ++ spin_lock_irqsave(&bus->lock, flags); ++ if (bus->master_state == ASPEED_I2C_MASTER_PENDING) ++ bus->master_state = ASPEED_I2C_MASTER_INACTIVE; ++ spin_unlock_irqrestore(&bus->lock, flags); ++ + return -ETIMEDOUT; + } + +-- +2.7.4 + diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0066-i2c-aspeed-add-buffer-mode-transfer-support.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0061-i2c-aspeed-add-buffer-mode-transfer-support.patch index 9b96b400b..8e91b5ced 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0066-i2c-aspeed-add-buffer-mode-transfer-support.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0061-i2c-aspeed-add-buffer-mode-transfer-support.patch @@ -1,4 +1,4 @@ -From 36128aacdc8b642b9ee080e493abbc00de345f1d Mon Sep 17 00:00:00 2001 +From 0bc5efede7c99da41fc0cbadfb1644b428ead9d3 Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo <jae.hyun.yoo@intel.com> Date: Tue, 11 Jun 2019 15:07:08 -0700 Subject: [PATCH] i2c: aspeed: add buffer mode transfer support @@ -33,11 +33,12 @@ Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> .../devicetree/bindings/i2c/i2c-aspeed.txt | 40 ++- arch/arm/boot/dts/aspeed-g4.dtsi | 47 ++-- arch/arm/boot/dts/aspeed-g5.dtsi | 47 ++-- + arch/arm/boot/dts/aspeed-g6.dtsi | 34 +-- drivers/i2c/busses/i2c-aspeed.c | 294 ++++++++++++++++++--- - 4 files changed, 349 insertions(+), 79 deletions(-) + 5 files changed, 366 insertions(+), 96 deletions(-) diff --git a/Documentation/devicetree/bindings/i2c/i2c-aspeed.txt b/Documentation/devicetree/bindings/i2c/i2c-aspeed.txt -index 724ee9f35c10..e1a0ae7a8c08 100644 +index 7da7e813b2b0..0ff3539cee95 100644 --- a/Documentation/devicetree/bindings/i2c/i2c-aspeed.txt +++ b/Documentation/devicetree/bindings/i2c/i2c-aspeed.txt @@ -3,7 +3,10 @@ Device tree configuration for the I2C busses on the AST24XX and AST25XX SoCs. @@ -52,7 +53,7 @@ index 724ee9f35c10..e1a0ae7a8c08 100644 - compatible : should be "aspeed,ast2400-i2c-bus" or "aspeed,ast2500-i2c-bus" - clocks : root clock of bus, should reference the APB -@@ -29,12 +32,21 @@ i2c { +@@ -28,12 +31,21 @@ i2c { #size-cells = <1>; ranges = <0 0x1e78a000 0x1000>; @@ -79,7 +80,7 @@ index 724ee9f35c10..e1a0ae7a8c08 100644 }; i2c0: i2c-bus@40 { -@@ -42,11 +54,25 @@ i2c { +@@ -41,11 +53,25 @@ i2c { #size-cells = <0>; #interrupt-cells = <1>; reg = <0x40 0x40>; @@ -107,10 +108,10 @@ index 724ee9f35c10..e1a0ae7a8c08 100644 + }; }; diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi b/arch/arm/boot/dts/aspeed-g4.dtsi -index 47a5029f5bdb..052b1b6b4dc7 100644 +index 14e5dc260a3b..68f40a89c91f 100644 --- a/arch/arm/boot/dts/aspeed-g4.dtsi +++ b/arch/arm/boot/dts/aspeed-g4.dtsi -@@ -469,12 +469,21 @@ +@@ -519,12 +519,21 @@ }; &i2c { @@ -137,7 +138,7 @@ index 47a5029f5bdb..052b1b6b4dc7 100644 }; i2c0: i2c-bus@40 { -@@ -482,7 +491,7 @@ +@@ -532,7 +541,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -146,7 +147,7 @@ index 47a5029f5bdb..052b1b6b4dc7 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -498,7 +507,7 @@ +@@ -548,7 +557,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -155,7 +156,7 @@ index 47a5029f5bdb..052b1b6b4dc7 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -514,7 +523,7 @@ +@@ -564,7 +573,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -164,7 +165,7 @@ index 47a5029f5bdb..052b1b6b4dc7 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -531,7 +540,7 @@ +@@ -581,7 +590,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -173,7 +174,7 @@ index 47a5029f5bdb..052b1b6b4dc7 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -548,7 +557,7 @@ +@@ -598,7 +607,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -182,7 +183,7 @@ index 47a5029f5bdb..052b1b6b4dc7 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -565,7 +574,7 @@ +@@ -615,7 +624,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -191,7 +192,7 @@ index 47a5029f5bdb..052b1b6b4dc7 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -582,7 +591,7 @@ +@@ -632,7 +641,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -200,7 +201,7 @@ index 47a5029f5bdb..052b1b6b4dc7 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -599,7 +608,7 @@ +@@ -649,7 +658,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -209,7 +210,7 @@ index 47a5029f5bdb..052b1b6b4dc7 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -616,7 +625,7 @@ +@@ -666,7 +675,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -218,7 +219,7 @@ index 47a5029f5bdb..052b1b6b4dc7 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -633,7 +642,7 @@ +@@ -683,7 +692,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -227,7 +228,7 @@ index 47a5029f5bdb..052b1b6b4dc7 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -650,7 +659,7 @@ +@@ -700,7 +709,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -236,7 +237,7 @@ index 47a5029f5bdb..052b1b6b4dc7 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -667,7 +676,7 @@ +@@ -717,7 +726,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -245,7 +246,7 @@ index 47a5029f5bdb..052b1b6b4dc7 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -684,7 +693,7 @@ +@@ -734,7 +743,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -254,7 +255,7 @@ index 47a5029f5bdb..052b1b6b4dc7 100644 compatible = "aspeed,ast2400-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -701,7 +710,7 @@ +@@ -751,7 +760,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -264,10 +265,10 @@ index 47a5029f5bdb..052b1b6b4dc7 100644 clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi -index 89a9febf6f14..2d2173d598e4 100644 +index 3d615708a0cd..fdc669ebfb84 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi -@@ -586,12 +586,21 @@ +@@ -616,12 +616,21 @@ }; &i2c { @@ -294,7 +295,7 @@ index 89a9febf6f14..2d2173d598e4 100644 }; i2c0: i2c-bus@40 { -@@ -599,7 +608,7 @@ +@@ -629,7 +638,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -303,7 +304,7 @@ index 89a9febf6f14..2d2173d598e4 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -615,7 +624,7 @@ +@@ -645,7 +654,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -312,7 +313,7 @@ index 89a9febf6f14..2d2173d598e4 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -631,7 +640,7 @@ +@@ -661,7 +670,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -321,7 +322,7 @@ index 89a9febf6f14..2d2173d598e4 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -648,7 +657,7 @@ +@@ -678,7 +687,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -330,7 +331,7 @@ index 89a9febf6f14..2d2173d598e4 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -665,7 +674,7 @@ +@@ -695,7 +704,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -339,7 +340,7 @@ index 89a9febf6f14..2d2173d598e4 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -682,7 +691,7 @@ +@@ -712,7 +721,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -348,7 +349,7 @@ index 89a9febf6f14..2d2173d598e4 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -699,7 +708,7 @@ +@@ -729,7 +738,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -357,7 +358,7 @@ index 89a9febf6f14..2d2173d598e4 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -716,7 +725,7 @@ +@@ -746,7 +755,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -366,7 +367,7 @@ index 89a9febf6f14..2d2173d598e4 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -733,7 +742,7 @@ +@@ -763,7 +772,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -375,7 +376,7 @@ index 89a9febf6f14..2d2173d598e4 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -750,7 +759,7 @@ +@@ -780,7 +789,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -384,7 +385,7 @@ index 89a9febf6f14..2d2173d598e4 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -767,7 +776,7 @@ +@@ -797,7 +806,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -393,7 +394,7 @@ index 89a9febf6f14..2d2173d598e4 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -784,7 +793,7 @@ +@@ -814,7 +823,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -402,7 +403,7 @@ index 89a9febf6f14..2d2173d598e4 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -801,7 +810,7 @@ +@@ -831,7 +840,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -411,7 +412,7 @@ index 89a9febf6f14..2d2173d598e4 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; -@@ -818,7 +827,7 @@ +@@ -848,7 +857,7 @@ #size-cells = <0>; #interrupt-cells = <1>; @@ -420,8 +421,161 @@ index 89a9febf6f14..2d2173d598e4 100644 compatible = "aspeed,ast2500-i2c-bus"; clocks = <&syscon ASPEED_CLK_APB>; resets = <&syscon ASPEED_RESET_I2C>; +diff --git a/arch/arm/boot/dts/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed-g6.dtsi +index 2ad90a906266..2dd89efee37c 100644 +--- a/arch/arm/boot/dts/aspeed-g6.dtsi ++++ b/arch/arm/boot/dts/aspeed-g6.dtsi +@@ -530,11 +530,11 @@ + #include "aspeed-g6-pinctrl.dtsi" + + &i2c { +- i2c0: i2c-bus@40 { ++ i2c0: i2c-bus@80 { + #address-cells = <1>; + #size-cells = <0>; + #interrupt-cells = <1>; +- reg = <0x80 0x80>; ++ reg = <0x80 0x80>, <0xc00 0x20>; + compatible = "aspeed,ast2600-i2c-bus"; + clocks = <&syscon ASPEED_CLK_APB1>; + resets = <&syscon ASPEED_RESET_I2C>; +@@ -549,7 +549,7 @@ + #address-cells = <1>; + #size-cells = <0>; + #interrupt-cells = <1>; +- reg = <0x100 0x80>; ++ reg = <0x100 0x80>, <0xc20 0x20>; + compatible = "aspeed,ast2600-i2c-bus"; + clocks = <&syscon ASPEED_CLK_APB1>; + resets = <&syscon ASPEED_RESET_I2C>; +@@ -564,7 +564,7 @@ + #address-cells = <1>; + #size-cells = <0>; + #interrupt-cells = <1>; +- reg = <0x180 0x80>; ++ reg = <0x180 0x80>, <0xc40 0x20>; + compatible = "aspeed,ast2600-i2c-bus"; + clocks = <&syscon ASPEED_CLK_APB1>; + resets = <&syscon ASPEED_RESET_I2C>; +@@ -579,7 +579,7 @@ + #address-cells = <1>; + #size-cells = <0>; + #interrupt-cells = <1>; +- reg = <0x200 0x80>; ++ reg = <0x200 0x80>, <0xc60 0x20>; + compatible = "aspeed,ast2600-i2c-bus"; + clocks = <&syscon ASPEED_CLK_APB1>; + resets = <&syscon ASPEED_RESET_I2C>; +@@ -594,7 +594,7 @@ + #address-cells = <1>; + #size-cells = <0>; + #interrupt-cells = <1>; +- reg = <0x280 0x80>; ++ reg = <0x280 0x80>, <0xc80 0x20>; + compatible = "aspeed,ast2600-i2c-bus"; + clocks = <&syscon ASPEED_CLK_APB1>; + resets = <&syscon ASPEED_RESET_I2C>; +@@ -609,7 +609,7 @@ + #address-cells = <1>; + #size-cells = <0>; + #interrupt-cells = <1>; +- reg = <0x300 0x80>; ++ reg = <0x300 0x80>, <0xca0 0x20>; + compatible = "aspeed,ast2600-i2c-bus"; + clocks = <&syscon ASPEED_CLK_APB1>; + resets = <&syscon ASPEED_RESET_I2C>; +@@ -624,7 +624,7 @@ + #address-cells = <1>; + #size-cells = <0>; + #interrupt-cells = <1>; +- reg = <0x380 0x80>; ++ reg = <0x380 0x80>, <0xcc0 0x20>; + compatible = "aspeed,ast2600-i2c-bus"; + clocks = <&syscon ASPEED_CLK_APB1>; + resets = <&syscon ASPEED_RESET_I2C>; +@@ -639,7 +639,7 @@ + #address-cells = <1>; + #size-cells = <0>; + #interrupt-cells = <1>; +- reg = <0x400 0x80>; ++ reg = <0x400 0x80>, <0xce0 0x20>; + compatible = "aspeed,ast2600-i2c-bus"; + clocks = <&syscon ASPEED_CLK_APB1>; + resets = <&syscon ASPEED_RESET_I2C>; +@@ -654,7 +654,7 @@ + #address-cells = <1>; + #size-cells = <0>; + #interrupt-cells = <1>; +- reg = <0x480 0x80>; ++ reg = <0x480 0x80>, <0xd00 0x20>; + compatible = "aspeed,ast2600-i2c-bus"; + clocks = <&syscon ASPEED_CLK_APB1>; + resets = <&syscon ASPEED_RESET_I2C>; +@@ -669,7 +669,7 @@ + #address-cells = <1>; + #size-cells = <0>; + #interrupt-cells = <1>; +- reg = <0x500 0x80>; ++ reg = <0x500 0x80>, <0xd20 0x20>; + compatible = "aspeed,ast2600-i2c-bus"; + clocks = <&syscon ASPEED_CLK_APB1>; + resets = <&syscon ASPEED_RESET_I2C>; +@@ -684,7 +684,7 @@ + #address-cells = <1>; + #size-cells = <0>; + #interrupt-cells = <1>; +- reg = <0x580 0x80>; ++ reg = <0x580 0x80>, <0xd40 0x20>; + compatible = "aspeed,ast2600-i2c-bus"; + clocks = <&syscon ASPEED_CLK_APB1>; + resets = <&syscon ASPEED_RESET_I2C>; +@@ -699,7 +699,7 @@ + #address-cells = <1>; + #size-cells = <0>; + #interrupt-cells = <1>; +- reg = <0x600 0x80>; ++ reg = <0x600 0x80>, <0xd60 0x20>; + compatible = "aspeed,ast2600-i2c-bus"; + clocks = <&syscon ASPEED_CLK_APB1>; + resets = <&syscon ASPEED_RESET_I2C>; +@@ -714,7 +714,7 @@ + #address-cells = <1>; + #size-cells = <0>; + #interrupt-cells = <1>; +- reg = <0x680 0x80>; ++ reg = <0x680 0x80>, <0xd80 0x20>; + compatible = "aspeed,ast2600-i2c-bus"; + clocks = <&syscon ASPEED_CLK_APB1>; + resets = <&syscon ASPEED_RESET_I2C>; +@@ -729,7 +729,7 @@ + #address-cells = <1>; + #size-cells = <0>; + #interrupt-cells = <1>; +- reg = <0x700 0x80>; ++ reg = <0x700 0x80>, <0xda0 0x20>; + compatible = "aspeed,ast2600-i2c-bus"; + clocks = <&syscon ASPEED_CLK_APB1>; + resets = <&syscon ASPEED_RESET_I2C>; +@@ -744,7 +744,7 @@ + #address-cells = <1>; + #size-cells = <0>; + #interrupt-cells = <1>; +- reg = <0x780 0x80>; ++ reg = <0x780 0x80>, <0xdc0 0x20>; + compatible = "aspeed,ast2600-i2c-bus"; + clocks = <&syscon ASPEED_CLK_APB1>; + resets = <&syscon ASPEED_RESET_I2C>; +@@ -759,7 +759,7 @@ + #address-cells = <1>; + #size-cells = <0>; + #interrupt-cells = <1>; +- reg = <0x800 0x80>; ++ reg = <0x800 0x80>, <0xde0 0x20>; + compatible = "aspeed,ast2600-i2c-bus"; + clocks = <&syscon ASPEED_CLK_APB1>; + resets = <&syscon ASPEED_RESET_I2C>; diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c -index d8143c24d3a7..b721fb1d6d4c 100644 +index b9f425739940..3831466912b4 100644 --- a/drivers/i2c/busses/i2c-aspeed.c +++ b/drivers/i2c/busses/i2c-aspeed.c @@ -7,6 +7,7 @@ @@ -475,7 +629,7 @@ index d8143c24d3a7..b721fb1d6d4c 100644 #define ASPEED_I2CD_MULTI_MASTER_DIS BIT(15) #define ASPEED_I2CD_SDA_DRIVE_1T_EN BIT(8) #define ASPEED_I2CD_M_SDA_DRIVE_1T_EN BIT(7) -@@ -104,6 +112,8 @@ +@@ -102,6 +110,8 @@ #define ASPEED_I2CD_BUS_RECOVER_CMD BIT(11) /* Command Bit */ @@ -484,7 +638,7 @@ index d8143c24d3a7..b721fb1d6d4c 100644 #define ASPEED_I2CD_M_STOP_CMD BIT(5) #define ASPEED_I2CD_M_S_RX_CMD_LAST BIT(4) #define ASPEED_I2CD_M_RX_CMD BIT(3) -@@ -114,6 +124,13 @@ +@@ -112,6 +122,13 @@ /* 0x18 : I2CD Slave Device Address Register */ #define ASPEED_I2CD_DEV_ADDR_MASK GENMASK(6, 0) @@ -498,7 +652,7 @@ index d8143c24d3a7..b721fb1d6d4c 100644 enum aspeed_i2c_master_state { ASPEED_I2C_MASTER_INACTIVE, ASPEED_I2C_MASTER_PENDING, -@@ -161,6 +178,11 @@ struct aspeed_i2c_bus { +@@ -157,6 +174,11 @@ struct aspeed_i2c_bus { int master_xfer_result; /* Multi-master */ bool multi_master; @@ -510,7 +664,7 @@ index d8143c24d3a7..b721fb1d6d4c 100644 #if IS_ENABLED(CONFIG_I2C_SLAVE) struct i2c_client *slave; enum aspeed_i2c_slave_state slave_state; -@@ -259,6 +281,7 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -253,6 +275,7 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) { u32 command, irq_handled = 0; struct i2c_client *slave = bus->slave; @@ -518,7 +672,7 @@ index d8143c24d3a7..b721fb1d6d4c 100644 u8 value; if (!slave) -@@ -287,7 +310,12 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -275,7 +298,12 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) /* Slave was sent something. */ if (irq_status & ASPEED_I2CD_INTR_RX_DONE) { @@ -532,7 +686,7 @@ index d8143c24d3a7..b721fb1d6d4c 100644 /* Handle address frame. */ if (bus->slave_state == ASPEED_I2C_SLAVE_START) { if (value & 0x1) -@@ -317,6 +345,20 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -290,6 +318,20 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) /* Slave was asked to stop. */ if (irq_status & ASPEED_I2CD_INTR_NORMAL_STOP) { @@ -553,7 +707,7 @@ index d8143c24d3a7..b721fb1d6d4c 100644 irq_handled |= ASPEED_I2CD_INTR_NORMAL_STOP; bus->slave_state = ASPEED_I2C_SLAVE_STOP; } -@@ -349,9 +391,36 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -322,9 +364,36 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) case ASPEED_I2C_SLAVE_WRITE_REQUESTED: bus->slave_state = ASPEED_I2C_SLAVE_WRITE_RECEIVED; i2c_slave_event(slave, I2C_SLAVE_WRITE_REQUESTED, &value); @@ -588,9 +742,9 @@ index d8143c24d3a7..b721fb1d6d4c 100644 + bus->base + ASPEED_I2C_CMD_REG); + } break; - case ASPEED_I2C_SLAVE_GCALL_REQUESTED: - bus->slave_state = ASPEED_I2C_SLAVE_WRITE_RECEIVED; -@@ -382,6 +451,8 @@ static void aspeed_i2c_do_start(struct aspeed_i2c_bus *bus) + case ASPEED_I2C_SLAVE_STOP: + i2c_slave_event(slave, I2C_SLAVE_STOP, &value); +@@ -350,6 +419,8 @@ static void aspeed_i2c_do_start(struct aspeed_i2c_bus *bus) u32 command = ASPEED_I2CD_M_START_CMD | ASPEED_I2CD_M_TX_CMD; struct i2c_msg *msg = &bus->msgs[bus->msgs_index]; u8 slave_addr = i2c_8bit_addr_from_msg(msg); @@ -599,7 +753,7 @@ index d8143c24d3a7..b721fb1d6d4c 100644 #if IS_ENABLED(CONFIG_I2C_SLAVE) /* -@@ -400,12 +471,66 @@ static void aspeed_i2c_do_start(struct aspeed_i2c_bus *bus) +@@ -368,12 +439,66 @@ static void aspeed_i2c_do_start(struct aspeed_i2c_bus *bus) if (msg->flags & I2C_M_RD) { command |= ASPEED_I2CD_M_RX_CMD; @@ -670,7 +824,7 @@ index d8143c24d3a7..b721fb1d6d4c 100644 writel(command, bus->base + ASPEED_I2C_CMD_REG); } -@@ -445,7 +570,7 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -413,7 +538,7 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) u32 irq_handled = 0, command = 0; struct i2c_msg *msg; u8 recv_byte; @@ -679,7 +833,7 @@ index d8143c24d3a7..b721fb1d6d4c 100644 if (irq_status & ASPEED_I2CD_INTR_BUS_RECOVER_DONE) { bus->master_state = ASPEED_I2C_MASTER_INACTIVE; -@@ -558,11 +683,43 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -526,11 +651,43 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) /* fall through */ case ASPEED_I2C_MASTER_TX_FIRST: if (bus->buf_index < msg->len) { @@ -727,7 +881,7 @@ index d8143c24d3a7..b721fb1d6d4c 100644 } else { aspeed_i2c_next_msg_or_stop(bus); } -@@ -579,25 +736,56 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -547,25 +704,56 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) } irq_handled |= ASPEED_I2CD_INTR_RX_DONE; @@ -798,7 +952,7 @@ index d8143c24d3a7..b721fb1d6d4c 100644 writel(command, bus->base + ASPEED_I2C_CMD_REG); } else { aspeed_i2c_next_msg_or_stop(bus); -@@ -947,6 +1135,9 @@ static int aspeed_i2c_init(struct aspeed_i2c_bus *bus, +@@ -911,6 +1099,9 @@ static int aspeed_i2c_init(struct aspeed_i2c_bus *bus, if (ret < 0) return ret; @@ -808,7 +962,7 @@ index d8143c24d3a7..b721fb1d6d4c 100644 if (of_property_read_bool(pdev->dev.of_node, "multi-master")) bus->multi_master = true; else -@@ -1007,16 +1198,15 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) +@@ -972,16 +1163,15 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) { const struct of_device_id *match; struct aspeed_i2c_bus *bus; @@ -827,7 +981,7 @@ index d8143c24d3a7..b721fb1d6d4c 100644 if (IS_ERR(bus->base)) return PTR_ERR(bus->base); -@@ -1050,6 +1240,42 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) +@@ -1015,6 +1205,42 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) bus->get_clk_reg_val = (u32 (*)(struct device *, u32)) match->data; @@ -852,10 +1006,10 @@ index d8143c24d3a7..b721fb1d6d4c 100644 + struct resource *res = platform_get_resource(pdev, + IORESOURCE_MEM, 1); + -+ bus->buf_base = devm_ioremap_resource(&pdev->dev, res); -+ if (IS_ERR(bus->buf_base) || resource_size(res) < 2) { -+ bus->buf_base = NULL; -+ } else { ++ if (res) ++ bus->buf_base = devm_ioremap_resource(&pdev->dev, res); ++ ++ if (!IS_ERR_OR_NULL(bus->buf_base) && resource_size(res) >= 2) { + bus->buf_size = resource_size(res); + if (of_device_is_compatible(pdev->dev.of_node, + "aspeed,ast2400-i2c-bus")) { @@ -870,7 +1024,7 @@ index d8143c24d3a7..b721fb1d6d4c 100644 /* Initialize the I2C adapter */ spin_lock_init(&bus->lock); init_completion(&bus->cmd_complete); -@@ -1085,8 +1311,8 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) +@@ -1050,8 +1276,8 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) platform_set_drvdata(pdev, bus); diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0067-i2c-aspeed-add-DMA-mode-transfer-support.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0062-i2c-aspeed-add-DMA-mode-transfer-support.patch index a051dbc4d..f3021d410 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0067-i2c-aspeed-add-DMA-mode-transfer-support.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0062-i2c-aspeed-add-DMA-mode-transfer-support.patch @@ -1,4 +1,4 @@ -From 7defe387ea07af3d48feb4daec78d54a284105f1 Mon Sep 17 00:00:00 2001 +From 09aece99e18a0fd0612c865394424afa74050171 Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo <jae.hyun.yoo@intel.com> Date: Tue, 18 Jun 2019 08:47:50 -0700 Subject: [PATCH] i2c: aspeed: add DMA mode transfer support @@ -20,14 +20,14 @@ Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> 2 files changed, 241 insertions(+), 15 deletions(-) diff --git a/Documentation/devicetree/bindings/i2c/i2c-aspeed.txt b/Documentation/devicetree/bindings/i2c/i2c-aspeed.txt -index e1a0ae7a8c08..97142516399a 100644 +index 0ff3539cee95..d3f4a39f7ba6 100644 --- a/Documentation/devicetree/bindings/i2c/i2c-aspeed.txt +++ b/Documentation/devicetree/bindings/i2c/i2c-aspeed.txt -@@ -19,6 +19,16 @@ Optional Properties: - - bus-frequency : frequency of the bus clock in Hz defaults to 100 kHz when not - specified - - multi-master : states that there is another master active on this bus. -+- aspeed,dma-buf-size : size of DMA buffer (from 2 to 4095 in case of AST2500). +@@ -22,6 +22,16 @@ Optional Properties: + - bus-timeout-ms: bus timeout in milliseconds defaults to 1 second when not + specified. + - #retries : Number of retries for master transfer. ++- aspeed,dma-buf-size : size of DMA buffer (from 2 to 4095 in case of AST2500) + Only AST2500 supports DMA mode under some limitations: + I2C is sharing the DMA H/W with UHCI host controller + and MCTP controller. Since those controllers operate @@ -37,10 +37,10 @@ index e1a0ae7a8c08..97142516399a 100644 + DMA mode instead of PIO or FIFO respectively, I2C + can't use DMA mode. IF both DMA and buffer modes are + enabled, DMA mode will be selected. - - general-call : enables general call receiving. - - bus-timeout-ms: bus timeout in milliseconds defaults to 1 second when not - specified. -@@ -75,4 +85,19 @@ i2c { + + Example: + +@@ -74,4 +84,19 @@ i2c { interrupts = <1>; interrupt-parent = <&i2c_ic>; }; @@ -61,7 +61,7 @@ index e1a0ae7a8c08..97142516399a 100644 + }; }; diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c -index b721fb1d6d4c..127bc69952ca 100644 +index e37f0764d184..4567ec3498dc 100644 --- a/drivers/i2c/busses/i2c-aspeed.c +++ b/drivers/i2c/busses/i2c-aspeed.c @@ -10,6 +10,8 @@ @@ -82,7 +82,7 @@ index b721fb1d6d4c..127bc69952ca 100644 /* Device Register Definition */ /* 0x00 : I2CD Function Control Register */ -@@ -112,6 +116,8 @@ +@@ -110,6 +114,8 @@ #define ASPEED_I2CD_BUS_RECOVER_CMD BIT(11) /* Command Bit */ @@ -91,7 +91,7 @@ index b721fb1d6d4c..127bc69952ca 100644 #define ASPEED_I2CD_RX_BUFF_ENABLE BIT(7) #define ASPEED_I2CD_TX_BUFF_ENABLE BIT(6) #define ASPEED_I2CD_M_STOP_CMD BIT(5) -@@ -131,6 +137,14 @@ +@@ -129,6 +135,14 @@ #define ASPEED_I2CD_BUF_TX_COUNT_MASK GENMASK(15, 8) #define ASPEED_I2CD_BUF_OFFSET_MASK GENMASK(5, 0) @@ -106,7 +106,7 @@ index b721fb1d6d4c..127bc69952ca 100644 enum aspeed_i2c_master_state { ASPEED_I2C_MASTER_INACTIVE, ASPEED_I2C_MASTER_PENDING, -@@ -183,6 +197,12 @@ struct aspeed_i2c_bus { +@@ -179,6 +193,12 @@ struct aspeed_i2c_bus { size_t buf_size; u8 buf_offset; u8 buf_page; @@ -119,7 +119,7 @@ index b721fb1d6d4c..127bc69952ca 100644 #if IS_ENABLED(CONFIG_I2C_SLAVE) struct i2c_client *slave; enum aspeed_i2c_slave_state slave_state; -@@ -310,9 +330,13 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -298,9 +318,13 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) /* Slave was sent something. */ if (irq_status & ASPEED_I2CD_INTR_RX_DONE) { @@ -134,7 +134,7 @@ index b721fb1d6d4c..127bc69952ca 100644 value = readb(bus->buf_base); else value = readl(bus->base + ASPEED_I2C_BYTE_BUF_REG) >> 8; -@@ -347,7 +371,18 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -320,7 +344,18 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) if (irq_status & ASPEED_I2CD_INTR_NORMAL_STOP) { if (bus->slave_state == ASPEED_I2C_SLAVE_WRITE_RECEIVED && irq_status & ASPEED_I2CD_INTR_RX_DONE) { @@ -154,7 +154,7 @@ index b721fb1d6d4c..127bc69952ca 100644 len = FIELD_GET(ASPEED_I2CD_BUF_RX_COUNT_MASK, readl(bus->base + ASPEED_I2C_BUF_CTRL_REG)); -@@ -391,7 +426,15 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -364,7 +399,15 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) case ASPEED_I2C_SLAVE_WRITE_REQUESTED: bus->slave_state = ASPEED_I2C_SLAVE_WRITE_RECEIVED; i2c_slave_event(slave, I2C_SLAVE_WRITE_REQUESTED, &value); @@ -171,7 +171,7 @@ index b721fb1d6d4c..127bc69952ca 100644 writel(FIELD_PREP(ASPEED_I2CD_BUF_RX_SIZE_MASK, bus->buf_size - 1) | FIELD_PREP(ASPEED_I2CD_BUF_OFFSET_MASK, -@@ -403,7 +446,25 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -376,7 +419,25 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) break; case ASPEED_I2C_SLAVE_WRITE_RECEIVED: i2c_slave_event(slave, I2C_SLAVE_WRITE_RECEIVED, &value); @@ -198,7 +198,7 @@ index b721fb1d6d4c..127bc69952ca 100644 len = FIELD_GET(ASPEED_I2CD_BUF_RX_COUNT_MASK, readl(bus->base + ASPEED_I2C_BUF_CTRL_REG)); -@@ -472,7 +533,23 @@ static void aspeed_i2c_do_start(struct aspeed_i2c_bus *bus) +@@ -440,7 +501,23 @@ static void aspeed_i2c_do_start(struct aspeed_i2c_bus *bus) if (msg->flags & I2C_M_RD) { command |= ASPEED_I2CD_M_RX_CMD; @@ -223,7 +223,7 @@ index b721fb1d6d4c..127bc69952ca 100644 command |= ASPEED_I2CD_RX_BUFF_ENABLE; if (msg->len > bus->buf_size) { -@@ -493,7 +570,26 @@ static void aspeed_i2c_do_start(struct aspeed_i2c_bus *bus) +@@ -461,7 +538,26 @@ static void aspeed_i2c_do_start(struct aspeed_i2c_bus *bus) command |= ASPEED_I2CD_M_S_RX_CMD_LAST; } } else { @@ -251,7 +251,7 @@ index b721fb1d6d4c..127bc69952ca 100644 int i; command |= ASPEED_I2CD_TX_BUFF_ENABLE; -@@ -529,7 +625,8 @@ static void aspeed_i2c_do_start(struct aspeed_i2c_bus *bus) +@@ -497,7 +593,8 @@ static void aspeed_i2c_do_start(struct aspeed_i2c_bus *bus) } } @@ -261,7 +261,7 @@ index b721fb1d6d4c..127bc69952ca 100644 writel(slave_addr, bus->base + ASPEED_I2C_BYTE_BUF_REG); writel(command, bus->base + ASPEED_I2C_CMD_REG); } -@@ -685,7 +782,28 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -653,7 +750,28 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) if (bus->buf_index < msg->len) { command = ASPEED_I2CD_M_TX_CMD; @@ -291,7 +291,7 @@ index b721fb1d6d4c..127bc69952ca 100644 u8 wbuf[4]; int i; -@@ -736,7 +854,15 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -704,7 +822,15 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) } irq_handled |= ASPEED_I2CD_INTR_RX_DONE; @@ -308,7 +308,7 @@ index b721fb1d6d4c..127bc69952ca 100644 len = FIELD_GET(ASPEED_I2CD_BUF_RX_COUNT_MASK, readl(bus->base + ASPEED_I2C_BUF_CTRL_REG)); -@@ -764,7 +890,25 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -732,7 +858,25 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) if (bus->buf_index < msg->len) { command = ASPEED_I2CD_M_RX_CMD; bus->master_state = ASPEED_I2C_MASTER_RX; @@ -335,7 +335,7 @@ index b721fb1d6d4c..127bc69952ca 100644 command |= ASPEED_I2CD_RX_BUFF_ENABLE; if (msg->len - bus->buf_index > -@@ -1257,7 +1401,51 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) +@@ -1222,7 +1366,51 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) sram_enabled = false; } @@ -388,7 +388,7 @@ index b721fb1d6d4c..127bc69952ca 100644 struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 1); -@@ -1297,24 +1485,33 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) +@@ -1262,24 +1450,33 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) */ ret = aspeed_i2c_init(bus, pdev); if (ret < 0) @@ -426,7 +426,7 @@ index b721fb1d6d4c..127bc69952ca 100644 } static int aspeed_i2c_remove_bus(struct platform_device *pdev) -@@ -1332,6 +1529,10 @@ static int aspeed_i2c_remove_bus(struct platform_device *pdev) +@@ -1297,6 +1494,10 @@ static int aspeed_i2c_remove_bus(struct platform_device *pdev) reset_control_assert(bus->rst); diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0058-i2c-aspeed-add-general-call-support.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0063-i2c-aspeed-add-general-call-support.patch index 7d5e006d1..381197a64 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0058-i2c-aspeed-add-general-call-support.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0063-i2c-aspeed-add-general-call-support.patch @@ -1,4 +1,4 @@ -From f5b6d42c1710a4c1314bc0160f904aa01f501e96 Mon Sep 17 00:00:00 2001 +From f9f2e586985f90197b30208599bd37a9fd7a7f63 Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo <jae.hyun.yoo@intel.com> Date: Wed, 1 May 2019 13:27:34 -0700 Subject: [PATCH] i2c: aspeed: add general call support @@ -16,10 +16,10 @@ Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/i2c/i2c-aspeed.txt b/Documentation/devicetree/bindings/i2c/i2c-aspeed.txt -index 7da7e813b2b0..724ee9f35c10 100644 +index d3f4a39f7ba6..c1ee99398517 100644 --- a/Documentation/devicetree/bindings/i2c/i2c-aspeed.txt +++ b/Documentation/devicetree/bindings/i2c/i2c-aspeed.txt -@@ -16,6 +16,7 @@ Optional Properties: +@@ -19,6 +19,7 @@ Optional Properties: - bus-frequency : frequency of the bus clock in Hz defaults to 100 kHz when not specified - multi-master : states that there is another master active on this bus. @@ -28,10 +28,10 @@ index 7da7e813b2b0..724ee9f35c10 100644 specified. - #retries : Number of retries for master transfer. diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c -index 99bd30953531..8f26060bd685 100644 +index 4567ec3498dc..3e72068f6a2b 100644 --- a/drivers/i2c/busses/i2c-aspeed.c +++ b/drivers/i2c/busses/i2c-aspeed.c -@@ -47,6 +47,7 @@ +@@ -59,6 +59,7 @@ #define ASPEED_I2CD_SDA_DRIVE_1T_EN BIT(8) #define ASPEED_I2CD_M_SDA_DRIVE_1T_EN BIT(7) #define ASPEED_I2CD_M_HIGH_SPEED_EN BIT(6) @@ -39,7 +39,7 @@ index 99bd30953531..8f26060bd685 100644 #define ASPEED_I2CD_SLAVE_EN BIT(1) #define ASPEED_I2CD_MASTER_EN BIT(0) -@@ -71,6 +72,7 @@ +@@ -83,6 +84,7 @@ */ #define ASPEED_I2CD_INTR_SDA_DL_TIMEOUT BIT(14) #define ASPEED_I2CD_INTR_BUS_RECOVER_DONE BIT(13) @@ -47,7 +47,7 @@ index 99bd30953531..8f26060bd685 100644 #define ASPEED_I2CD_INTR_SLAVE_MATCH BIT(7) #define ASPEED_I2CD_INTR_SCL_TIMEOUT BIT(6) #define ASPEED_I2CD_INTR_ABNORMAL BIT(5) -@@ -130,6 +132,8 @@ enum aspeed_i2c_slave_state { +@@ -161,6 +163,8 @@ enum aspeed_i2c_slave_state { ASPEED_I2C_SLAVE_READ_PROCESSED, ASPEED_I2C_SLAVE_WRITE_REQUESTED, ASPEED_I2C_SLAVE_WRITE_RECEIVED, @@ -56,7 +56,7 @@ index 99bd30953531..8f26060bd685 100644 ASPEED_I2C_SLAVE_STOP, }; -@@ -160,6 +164,8 @@ struct aspeed_i2c_bus { +@@ -202,6 +206,8 @@ struct aspeed_i2c_bus { #if IS_ENABLED(CONFIG_I2C_SLAVE) struct i2c_client *slave; enum aspeed_i2c_slave_state slave_state; @@ -65,7 +65,7 @@ index 99bd30953531..8f26060bd685 100644 #endif /* CONFIG_I2C_SLAVE */ }; -@@ -266,6 +272,12 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -309,6 +315,12 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) bus->slave_state = ASPEED_I2C_SLAVE_START; } @@ -78,7 +78,7 @@ index 99bd30953531..8f26060bd685 100644 /* Slave is not currently active, irq was for someone else. */ if (bus->slave_state == ASPEED_I2C_SLAVE_INACTIVE) return irq_handled; -@@ -284,6 +296,21 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -336,6 +348,21 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) else bus->slave_state = ASPEED_I2C_SLAVE_WRITE_REQUESTED; @@ -100,9 +100,9 @@ index 99bd30953531..8f26060bd685 100644 } irq_handled |= ASPEED_I2CD_INTR_RX_DONE; } -@@ -326,11 +353,16 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) - case ASPEED_I2C_SLAVE_WRITE_RECEIVED: - i2c_slave_event(slave, I2C_SLAVE_WRITE_RECEIVED, &value); +@@ -456,11 +483,16 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) + bus->base + ASPEED_I2C_CMD_REG); + } break; + case ASPEED_I2C_SLAVE_GCALL_REQUESTED: + bus->slave_state = ASPEED_I2C_SLAVE_WRITE_RECEIVED; @@ -117,7 +117,7 @@ index 99bd30953531..8f26060bd685 100644 /* Slave was just started. Waiting for the next event. */; break; default: -@@ -738,6 +770,8 @@ static void __aspeed_i2c_reg_slave(struct aspeed_i2c_bus *bus, u16 slave_addr) +@@ -1071,6 +1103,8 @@ static void __aspeed_i2c_reg_slave(struct aspeed_i2c_bus *bus, u16 slave_addr) /* Turn on slave mode. */ func_ctrl_reg_val = readl(bus->base + ASPEED_I2C_FUN_CTRL_REG); func_ctrl_reg_val |= ASPEED_I2CD_SLAVE_EN; @@ -126,7 +126,7 @@ index 99bd30953531..8f26060bd685 100644 writel(func_ctrl_reg_val, bus->base + ASPEED_I2C_FUN_CTRL_REG); } -@@ -776,6 +810,8 @@ static int aspeed_i2c_unreg_slave(struct i2c_client *client) +@@ -1109,6 +1143,8 @@ static int aspeed_i2c_unreg_slave(struct i2c_client *client) /* Turn off slave mode. */ func_ctrl_reg_val = readl(bus->base + ASPEED_I2C_FUN_CTRL_REG); func_ctrl_reg_val &= ~ASPEED_I2CD_SLAVE_EN; @@ -135,7 +135,7 @@ index 99bd30953531..8f26060bd685 100644 writel(func_ctrl_reg_val, bus->base + ASPEED_I2C_FUN_CTRL_REG); bus->slave = NULL; -@@ -920,6 +956,9 @@ static int aspeed_i2c_init(struct aspeed_i2c_bus *bus, +@@ -1256,6 +1292,9 @@ static int aspeed_i2c_init(struct aspeed_i2c_bus *bus, bus->base + ASPEED_I2C_FUN_CTRL_REG); #if IS_ENABLED(CONFIG_I2C_SLAVE) @@ -164,10 +164,10 @@ index 2c7a6038409c..1d4db584b393 100644 case I2C_SLAVE_WRITE_RECEIVED: diff --git a/include/linux/i2c.h b/include/linux/i2c.h -index 3ee92c6a442d..dfdccb2acb24 100644 +index 92c795ce9081..1e5c74888160 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h -@@ -359,6 +359,7 @@ enum i2c_slave_event { +@@ -365,6 +365,7 @@ enum i2c_slave_event { I2C_SLAVE_WRITE_REQUESTED, I2C_SLAVE_READ_PROCESSED, I2C_SLAVE_WRITE_RECEIVED, diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0001-set-idle-disconnect-to-true-in-all-cases.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0064-set-idle-disconnect-to-true-in-all-cases.patch index 925880eff..925880eff 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0001-set-idle-disconnect-to-true-in-all-cases.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0064-set-idle-disconnect-to-true-in-all-cases.patch diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0065-i2c-aspeed-fix-master-pending-state-handling.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0065-i2c-aspeed-fix-master-pending-state-handling.patch deleted file mode 100644 index 003a96c8d..000000000 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0065-i2c-aspeed-fix-master-pending-state-handling.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 4a05d2506e7cb7fb3ad323a16861f09279b4da39 Mon Sep 17 00:00:00 2001 -From: Jae Hyun Yoo <jae.hyun.yoo@intel.com> -Date: Tue, 11 Jun 2019 14:59:53 -0700 -Subject: [PATCH] i2c: aspeed: fix master pending state handling - -In case of a master pending state, it should not trigger the master -command because this H/W is sharing the same byte buffer for slave -and master operation, so this commit fixes the issue with making -the master command triggering happens when the state goes to active -state. - -Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> ---- - drivers/i2c/busses/i2c-aspeed.c | 9 +++++---- - 1 file changed, 5 insertions(+), 4 deletions(-) - -diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c -index 8f26060bd685..d8143c24d3a7 100644 ---- a/drivers/i2c/busses/i2c-aspeed.c -+++ b/drivers/i2c/busses/i2c-aspeed.c -@@ -383,18 +383,19 @@ static void aspeed_i2c_do_start(struct aspeed_i2c_bus *bus) - struct i2c_msg *msg = &bus->msgs[bus->msgs_index]; - u8 slave_addr = i2c_8bit_addr_from_msg(msg); - -- bus->master_state = ASPEED_I2C_MASTER_START; -- - #if IS_ENABLED(CONFIG_I2C_SLAVE) - /* - * If it's requested in the middle of a slave session, set the master - * state to 'pending' then H/W will continue handling this master - * command when the bus comes back to the idle state. - */ -- if (bus->slave_state != ASPEED_I2C_SLAVE_INACTIVE) -+ if (bus->slave_state != ASPEED_I2C_SLAVE_INACTIVE) { - bus->master_state = ASPEED_I2C_MASTER_PENDING; -+ return; -+ } - #endif /* CONFIG_I2C_SLAVE */ - -+ bus->master_state = ASPEED_I2C_MASTER_START; - bus->buf_index = 0; - - if (msg->flags & I2C_M_RD) { -@@ -479,7 +480,7 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) - if (bus->slave_state != ASPEED_I2C_SLAVE_INACTIVE) - goto out_no_complete; - -- bus->master_state = ASPEED_I2C_MASTER_START; -+ aspeed_i2c_do_start(bus); - } - #endif /* CONFIG_I2C_SLAVE */ - --- -2.7.4 - diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0068-i2c-aspeed-add-H-W-timeout-support.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0068-i2c-aspeed-add-H-W-timeout-support.patch index f4dfd6cfa..ba564e695 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0068-i2c-aspeed-add-H-W-timeout-support.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0068-i2c-aspeed-add-H-W-timeout-support.patch @@ -1,4 +1,4 @@ -From 9a43b47fb794fd195912c6956783b021a46307f8 Mon Sep 17 00:00:00 2001 +From 25a38287274f9c39eb8355d51ba06203efdb07aa Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo <jae.hyun.yoo@intel.com> Date: Thu, 11 Jul 2019 13:53:34 -0700 Subject: [PATCH] i2c: aspeed: add H/W timeout support @@ -7,14 +7,22 @@ This commit adds I2C H/W timeout support. Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> --- - drivers/i2c/busses/i2c-aspeed.c | 79 +++++++++++++++++++++++++++++++++++++---- - 1 file changed, 73 insertions(+), 6 deletions(-) + drivers/i2c/busses/i2c-aspeed.c | 82 ++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 76 insertions(+), 6 deletions(-) diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c -index 0ed9a27850e6..ecb5793036cc 100644 +index 127bc69952ca..542b0f4017eb 100644 --- a/drivers/i2c/busses/i2c-aspeed.c +++ b/drivers/i2c/busses/i2c-aspeed.c -@@ -71,10 +71,14 @@ +@@ -55,6 +55,7 @@ + /* Device Register Definition */ + /* 0x00 : I2CD Function Control Register */ + #define ASPEED_I2CD_BUFFER_PAGE_SEL_MASK GENMASK(22, 20) ++#define ASPEED_I2CD_BUS_AUTO_RECOVERY_EN BIT(17) + #define ASPEED_I2CD_MULTI_MASTER_DIS BIT(15) + #define ASPEED_I2CD_SDA_DRIVE_1T_EN BIT(8) + #define ASPEED_I2CD_M_SDA_DRIVE_1T_EN BIT(7) +@@ -71,10 +72,14 @@ #define ASPEED_I2CD_TIME_SCL_HIGH_MASK GENMASK(19, 16) #define ASPEED_I2CD_TIME_SCL_LOW_SHIFT 12 #define ASPEED_I2CD_TIME_SCL_LOW_MASK GENMASK(15, 12) @@ -30,7 +38,7 @@ index 0ed9a27850e6..ecb5793036cc 100644 /* 0x0c : I2CD Interrupt Control Register & * 0x10 : I2CD Interrupt Status Register -@@ -82,6 +86,7 @@ +@@ -82,6 +87,7 @@ * These share bit definitions, so use the same values for the enable & * status bits. */ @@ -38,7 +46,7 @@ index 0ed9a27850e6..ecb5793036cc 100644 #define ASPEED_I2CD_INTR_SDA_DL_TIMEOUT BIT(14) #define ASPEED_I2CD_INTR_BUS_RECOVER_DONE BIT(13) #define ASPEED_I2CD_INTR_GCALL_ADDR BIT(8) -@@ -98,8 +103,11 @@ +@@ -98,8 +104,11 @@ ASPEED_I2CD_INTR_SCL_TIMEOUT | \ ASPEED_I2CD_INTR_ABNORMAL | \ ASPEED_I2CD_INTR_ARBIT_LOSS) @@ -51,7 +59,7 @@ index 0ed9a27850e6..ecb5793036cc 100644 ASPEED_I2CD_INTR_BUS_RECOVER_DONE | \ ASPEED_I2CD_INTR_SCL_TIMEOUT | \ ASPEED_I2CD_INTR_ABNORMAL | \ -@@ -180,6 +188,7 @@ struct aspeed_i2c_bus { +@@ -180,6 +189,7 @@ struct aspeed_i2c_bus { u32 divisor); unsigned long parent_clk_frequency; u32 bus_frequency; @@ -59,7 +67,7 @@ index 0ed9a27850e6..ecb5793036cc 100644 /* Transaction state. */ enum aspeed_i2c_master_state master_state; struct i2c_msg *msgs; -@@ -297,6 +306,14 @@ static int aspeed_i2c_recover_bus(struct aspeed_i2c_bus *bus) +@@ -297,6 +307,14 @@ static int aspeed_i2c_recover_bus(struct aspeed_i2c_bus *bus) } #if IS_ENABLED(CONFIG_I2C_SLAVE) @@ -74,7 +82,7 @@ index 0ed9a27850e6..ecb5793036cc 100644 static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) { u32 command, irq_handled = 0; -@@ -307,6 +324,14 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -307,6 +325,14 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) if (!slave) return 0; @@ -89,7 +97,7 @@ index 0ed9a27850e6..ecb5793036cc 100644 command = readl(bus->base + ASPEED_I2C_CMD_REG); /* Slave was requested, restart state machine. */ -@@ -649,7 +674,7 @@ static void aspeed_i2c_next_msg_or_stop(struct aspeed_i2c_bus *bus) +@@ -649,7 +675,7 @@ static void aspeed_i2c_next_msg_or_stop(struct aspeed_i2c_bus *bus) } } @@ -98,7 +106,7 @@ index 0ed9a27850e6..ecb5793036cc 100644 { if (irq_status & ASPEED_I2CD_INTR_ARBIT_LOSS) return -EAGAIN; -@@ -680,9 +705,9 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -680,9 +706,9 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) * should clear the command queue effectively taking us back to the * INACTIVE state. */ @@ -110,7 +118,7 @@ index 0ed9a27850e6..ecb5793036cc 100644 irq_status); irq_handled |= (irq_status & ASPEED_I2CD_INTR_MASTER_ERRORS); if (bus->master_state != ASPEED_I2C_MASTER_INACTIVE) { -@@ -1251,6 +1276,7 @@ static u32 aspeed_i2c_25xx_get_clk_reg_val(struct device *dev, u32 divisor) +@@ -1251,6 +1277,7 @@ static u32 aspeed_i2c_25xx_get_clk_reg_val(struct device *dev, u32 divisor) /* precondition: bus.lock has been acquired. */ static int aspeed_i2c_init_clk(struct aspeed_i2c_bus *bus) { @@ -118,7 +126,7 @@ index 0ed9a27850e6..ecb5793036cc 100644 u32 divisor, clk_reg_val; divisor = DIV_ROUND_UP(bus->parent_clk_frequency, bus->bus_frequency); -@@ -1259,8 +1285,46 @@ static int aspeed_i2c_init_clk(struct aspeed_i2c_bus *bus) +@@ -1259,8 +1286,46 @@ static int aspeed_i2c_init_clk(struct aspeed_i2c_bus *bus) ASPEED_I2CD_TIME_THDSTA_MASK | ASPEED_I2CD_TIME_TACST_MASK); clk_reg_val |= bus->get_clk_reg_val(bus->dev, divisor); @@ -166,16 +174,18 @@ index 0ed9a27850e6..ecb5793036cc 100644 return 0; } -@@ -1464,6 +1528,9 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) - } - } +@@ -1275,6 +1340,11 @@ static int aspeed_i2c_init(struct aspeed_i2c_bus *bus, + /* Disable everything. */ + writel(0, bus->base + ASPEED_I2C_FUN_CTRL_REG); + device_property_read_u32(&pdev->dev, "aspeed,hw-timeout-ms", + &bus->hw_timeout_ms); ++ if (bus->hw_timeout_ms) ++ fun_ctrl_reg |= ASPEED_I2CD_BUS_AUTO_RECOVERY_EN; + - /* Initialize the I2C adapter */ - spin_lock_init(&bus->lock); - init_completion(&bus->cmd_complete); + ret = aspeed_i2c_init_clk(bus); + if (ret < 0) + return ret; -- 2.7.4 diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0069-i2c-aspeed-add-SLAVE_ADDR_RECEIVED_PENDING-interrupt.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0069-i2c-aspeed-add-SLAVE_ADDR_RECEIVED_PENDING-interrupt.patch index dc38c81f3..8fc35243c 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0069-i2c-aspeed-add-SLAVE_ADDR_RECEIVED_PENDING-interrupt.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0069-i2c-aspeed-add-SLAVE_ADDR_RECEIVED_PENDING-interrupt.patch @@ -1,4 +1,4 @@ -From 085bde1e91d85435c44a752bd59d38cf31465518 Mon Sep 17 00:00:00 2001 +From 6ffb52e1f1d80fd3116fccef045bcdc78d2d361c Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo <jae.hyun.yoo@intel.com> Date: Thu, 11 Jul 2019 14:04:39 -0700 Subject: [PATCH] i2c: aspeed: add SLAVE_ADDR_RECEIVED_PENDING interrupt @@ -15,10 +15,10 @@ Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> 1 file changed, 13 insertions(+) diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c -index d41f377de9dc..46de9a01a0eb 100644 +index bcc354d11e29..0070366e9d6d 100644 --- a/drivers/i2c/busses/i2c-aspeed.c +++ b/drivers/i2c/busses/i2c-aspeed.c -@@ -86,6 +86,7 @@ +@@ -87,6 +87,7 @@ * These share bit definitions, so use the same values for the enable & * status bits. */ @@ -26,7 +26,7 @@ index d41f377de9dc..46de9a01a0eb 100644 #define ASPEED_I2CD_INTR_SLAVE_INACTIVE_TIMEOUT BIT(15) #define ASPEED_I2CD_INTR_SDA_DL_TIMEOUT BIT(14) #define ASPEED_I2CD_INTR_BUS_RECOVER_DONE BIT(13) -@@ -353,6 +354,18 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) +@@ -354,6 +355,18 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) dev_dbg(bus->dev, "slave irq status 0x%08x, cmd 0x%08x\n", irq_status, command); diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0070-gpio-aspeed-temporary-fix-for-gpiochip-range-setting.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0070-gpio-aspeed-temporary-fix-for-gpiochip-range-setting.patch index 4af5be95d..bcee8bc6c 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0070-gpio-aspeed-temporary-fix-for-gpiochip-range-setting.patch +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0070-gpio-aspeed-temporary-fix-for-gpiochip-range-setting.patch @@ -1,4 +1,4 @@ -From 9195eef3fec7022ca52ac9791c19de2362ed042e Mon Sep 17 00:00:00 2001 +From 89e1d083726d4d56703a6787f4707d61a2c0efd1 Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo <jae.hyun.yoo@intel.com> Date: Fri, 19 Jul 2019 12:54:38 -0700 Subject: [PATCH] gpio: aspeed: temporary fix for gpiochip range setting @@ -14,31 +14,31 @@ Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpio/gpio-aspeed.c b/drivers/gpio/gpio-aspeed.c -index e426452a28f7..d4aaf7fa8e4b 100644 +index ac33f8134fe6..4f1a40b3a73f 100644 --- a/drivers/gpio/gpio-aspeed.c +++ b/drivers/gpio/gpio-aspeed.c -@@ -1189,7 +1189,7 @@ static int __init aspeed_gpio_probe(struct platform_device *pdev) +@@ -1181,7 +1181,7 @@ static int __init aspeed_gpio_probe(struct platform_device *pdev) gpio->chip.set = aspeed_gpio_set; gpio->chip.set_config = aspeed_gpio_set_config; gpio->chip.label = dev_name(&pdev->dev); - gpio->chip.base = -1; + gpio->chip.base = 0; - gpio->chip.irq.need_valid_mask = true; /* Allocate a cache of the output registers */ + banks = DIV_ROUND_UP(gpio->chip.ngpio, 32); diff --git a/drivers/gpio/sgpio-aspeed.c b/drivers/gpio/sgpio-aspeed.c -index 6fb402a3f74d..2f4c0aab0bf2 100644 +index d2dbfce531a4..792ef0d70ecf 100644 --- a/drivers/gpio/sgpio-aspeed.c +++ b/drivers/gpio/sgpio-aspeed.c -@@ -675,7 +675,7 @@ static int __init aspeed_sgpio_probe(struct platform_device *pdev) +@@ -678,7 +678,7 @@ static int __init aspeed_sgpio_probe(struct platform_device *pdev) gpio->chip.set = aspeed_sgpio_set; gpio->chip.set_config = aspeed_sgpio_set_config; gpio->chip.label = dev_name(&pdev->dev); - gpio->chip.base = -1; + gpio->chip.base = gpio->config->nr_pgpios; - gpio->chip.irq.need_valid_mask = true; - /* Allocate a cache of the output registers */ + rc = aspeed_sgpio_setup_irqs(gpio, pdev); + if (rc < 0) -- 2.7.4 diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0071-peci-add-a-temporary-workaround.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0071-peci-add-a-temporary-workaround.patch deleted file mode 100644 index e32ec54ac..000000000 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0071-peci-add-a-temporary-workaround.patch +++ /dev/null @@ -1,101 +0,0 @@ -From 3394fabbd17ad7263feeb0f4ae593056237f0647 Mon Sep 17 00:00:00 2001 -From: Jae Hyun Yoo <jae.hyun.yoo@intel.com> -Date: Tue, 30 Jul 2019 13:01:58 -0700 -Subject: [PATCH] peci: add a temporary workaround - -To cover a PECI issue, this commit makes PECI driver block all PECI -commands when PLTRST_N signal is 0. - -Also, it adds 'use_wa' module parameter for platforms that don't have -the PLTRST_N gpio input so that the WA can be disabled through the -module parameter. - -This is a temporary workaround. - -Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> ---- - drivers/peci/busses/peci-aspeed.c | 11 +++++++++++ - drivers/peci/peci-core.c | 11 +++++++++++ - include/linux/peci.h | 1 + - 3 files changed, 23 insertions(+) - -diff --git a/drivers/peci/busses/peci-aspeed.c b/drivers/peci/busses/peci-aspeed.c -index 8a0dd40730cc..76394ab32854 100644 ---- a/drivers/peci/busses/peci-aspeed.c -+++ b/drivers/peci/busses/peci-aspeed.c -@@ -10,6 +10,7 @@ - #include <linux/jiffies.h> - #include <linux/module.h> - #include <linux/of.h> -+#include <linux/of_gpio.h> - #include <linux/peci.h> - #include <linux/platform_device.h> - #include <linux/reset.h> -@@ -445,6 +446,16 @@ static int aspeed_peci_probe(struct platform_device *pdev) - if (ret) - goto err_put_adapter_dev; - -+ priv->adapter->pltrst_pin = of_get_gpio(pdev->dev.of_node, 0); -+ if (gpio_is_valid(priv->adapter->pltrst_pin)) { -+ ret = devm_gpio_request(&pdev->dev, priv->adapter->pltrst_pin, -+ "peci-aspeed"); -+ if (ret < 0) { -+ priv->adapter->pltrst_pin = -1; -+ dev_err(&pdev->dev, "error requesting pltrst gpio\n"); -+ } -+ } -+ - ret = peci_add_adapter(priv->adapter); - if (ret) - goto err_put_adapter_dev; -diff --git a/drivers/peci/peci-core.c b/drivers/peci/peci-core.c -index b99ba788a032..2e3b9a0c83e9 100644 ---- a/drivers/peci/peci-core.c -+++ b/drivers/peci/peci-core.c -@@ -5,6 +5,7 @@ - #include <linux/crc8.h> - #include <linux/delay.h> - #include <linux/mm.h> -+#include <linux/gpio.h> - #include <linux/module.h> - #include <linux/of_device.h> - #include <linux/peci.h> -@@ -190,6 +191,11 @@ static int peci_aw_fcs(struct peci_xfer_msg *msg, int len, u8 *aw_fcs) - return 0; - } - -+/* Temporary WA */ -+static bool use_wa __read_mostly = true; -+module_param_named(use_wa, use_wa, bool, 0644); -+MODULE_PARM_DESC(use_wa, "flag for enabling of WA"); -+ - static int __peci_xfer(struct peci_adapter *adapter, struct peci_xfer_msg *msg, - bool do_retry, bool has_aw_fcs) - { -@@ -197,6 +203,11 @@ static int __peci_xfer(struct peci_adapter *adapter, struct peci_xfer_msg *msg, - u8 aw_fcs; - int ret; - -+ /* Temporary WA */ -+ if (use_wa && gpio_is_valid(adapter->pltrst_pin) && -+ gpio_get_value(adapter->pltrst_pin) == 0) -+ return -EAGAIN; -+ - /* - * In case if adapter uses DMA, check at here whether tx and rx buffers - * are DMA capable or not. -diff --git a/include/linux/peci.h b/include/linux/peci.h -index 6fc424dc2a73..e589cb258a2a 100644 ---- a/include/linux/peci.h -+++ b/include/linux/peci.h -@@ -44,6 +44,7 @@ struct peci_adapter { - struct peci_xfer_msg *msg); - u32 cmd_mask; - bool use_dma; -+ int pltrst_pin; - }; - - static inline struct peci_adapter *to_peci_adapter(void *d) --- -2.7.4 - diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0073-Add-IO-statistics-to-USB-Mass-storage-gadget.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0073-Add-IO-statistics-to-USB-Mass-storage-gadget.patch new file mode 100644 index 000000000..41969349e --- /dev/null +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0073-Add-IO-statistics-to-USB-Mass-storage-gadget.patch @@ -0,0 +1,155 @@ +From 5c82e0b33f2a373d5e19569635f108cfa096f53e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Adrian=20Ambro=C5=BCewicz?= <adrian.ambrozewicz@intel.com> +Date: Mon, 29 Jul 2019 10:19:00 +0200 +Subject: [PATCH] Add IO stats to USB Mass Storage gadget +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Introduces new attribute to Mass Storage Gadget ConfigFS : stats. +It's read-only attribute which contains statistics of read/write operations +based on LUN transaction counters (IO number and bytes transferred). + +Goal is to provide a way to observe whether simulated device is actually +used by host. Statistics on hosted file / nbd level are not always viable +due to page cache having severe impact on actual IO statistics. +This attribute should provide information about host IO on USB Gadget as +close to endpoint as possible. + +Attribute is tied completely to configFS implementation and it's lifecycle +is managed by Kernel and user. Driver implements a handler which populates +output buffer on read. + +Tests performed: +- mounted USB Mass Storage gadget, new attribute showed up in gadget tree +- attribute was monitored for changes during IO performed on host machine +- removed device, attribute (along with other device attributes) was gone + +Signed-off-by: Adrian Ambrożewicz <adrian.ambrozewicz@intel.com> +--- + drivers/usb/gadget/function/f_mass_storage.c | 12 ++++++++++++ + drivers/usb/gadget/function/storage_common.c | 9 +++++++++ + drivers/usb/gadget/function/storage_common.h | 29 ++++++++++++++++++++++++++++ + 3 files changed, 50 insertions(+) + +diff --git a/drivers/usb/gadget/function/f_mass_storage.c b/drivers/usb/gadget/function/f_mass_storage.c +index 7c96c4665178..ecc3c68a7882 100644 +--- a/drivers/usb/gadget/function/f_mass_storage.c ++++ b/drivers/usb/gadget/function/f_mass_storage.c +@@ -710,6 +710,8 @@ static int do_read(struct fsg_common *common) + amount_left -= nread; + common->residue -= nread; + ++ fsg_stats_rd_attempt(&curlun->stats, nread); ++ + /* + * Except at the end of the transfer, nread will be + * equal to the buffer size, which is divisible by the +@@ -907,6 +909,8 @@ static int do_write(struct fsg_common *common) + amount_left_to_write -= nwritten; + common->residue -= nwritten; + ++ fsg_stats_wr_attempt(&curlun->stats, nwritten); ++ + /* If an error occurred, report it and its position */ + if (nwritten < amount) { + curlun->sense_data = SS_WRITE_ERROR; +@@ -3122,6 +3126,13 @@ static ssize_t fsg_lun_opts_inquiry_string_store(struct config_item *item, + + CONFIGFS_ATTR(fsg_lun_opts_, inquiry_string); + ++static ssize_t fsg_lun_opts_stats_show(struct config_item *item, char *page) ++{ ++ return fsg_show_stats(to_fsg_lun_opts(item)->lun, page); ++} ++ ++CONFIGFS_ATTR_RO(fsg_lun_opts_, stats); ++ + static struct configfs_attribute *fsg_lun_attrs[] = { + &fsg_lun_opts_attr_file, + &fsg_lun_opts_attr_ro, +@@ -3129,6 +3140,7 @@ static struct configfs_attribute *fsg_lun_attrs[] = { + &fsg_lun_opts_attr_cdrom, + &fsg_lun_opts_attr_nofua, + &fsg_lun_opts_attr_inquiry_string, ++ &fsg_lun_opts_attr_stats, + NULL, + }; + +diff --git a/drivers/usb/gadget/function/storage_common.c b/drivers/usb/gadget/function/storage_common.c +index f7e6c42558eb..2325b97961df 100644 +--- a/drivers/usb/gadget/function/storage_common.c ++++ b/drivers/usb/gadget/function/storage_common.c +@@ -371,6 +371,15 @@ ssize_t fsg_show_inquiry_string(struct fsg_lun *curlun, char *buf) + } + EXPORT_SYMBOL_GPL(fsg_show_inquiry_string); + ++ssize_t fsg_show_stats(struct fsg_lun *curlun, char *buf) ++{ ++ return sprintf(buf, "read cnt: %u\n" "read sum: %llu\n" ++ "write cnt: %u\n" "write sum: %llu\n", ++ curlun->stats.read.count, curlun->stats.read.bytes, ++ curlun->stats.write.count, curlun->stats.write.bytes); ++} ++EXPORT_SYMBOL_GPL(fsg_show_stats); ++ + /* + * The caller must hold fsg->filesem for reading when calling this function. + */ +diff --git a/drivers/usb/gadget/function/storage_common.h b/drivers/usb/gadget/function/storage_common.h +index e5e3a2553aaa..447021ba821a 100644 +--- a/drivers/usb/gadget/function/storage_common.h ++++ b/drivers/usb/gadget/function/storage_common.h +@@ -95,6 +95,32 @@ do { \ + */ + #define INQUIRY_STRING_LEN ((size_t) (8 + 16 + 4 + 1)) + ++struct fsg_stats_cnt { ++ u64 bytes; ++ u32 count; ++}; ++ ++struct fsg_stats { ++ struct fsg_stats_cnt read; ++ struct fsg_stats_cnt write; ++}; ++ ++static inline void fsg_stats_update(struct fsg_stats_cnt *cnt, u64 diff) ++{ ++ cnt->count++; ++ cnt->bytes += diff; ++} ++ ++static inline void fsg_stats_wr_attempt(struct fsg_stats *stats, u64 b_written) ++{ ++ fsg_stats_update(&stats->write, b_written); ++} ++ ++static inline void fsg_stats_rd_attempt(struct fsg_stats *stats, u64 b_read) ++{ ++ fsg_stats_update(&stats->read, b_read); ++} ++ + struct fsg_lun { + struct file *filp; + loff_t file_length; +@@ -120,6 +146,8 @@ struct fsg_lun { + const char *name; /* "lun.name" */ + const char **name_pfx; /* "function.name" */ + char inquiry_string[INQUIRY_STRING_LEN]; ++ ++ struct fsg_stats stats; + }; + + static inline bool fsg_lun_is_open(struct fsg_lun *curlun) +@@ -213,6 +241,7 @@ ssize_t fsg_show_file(struct fsg_lun *curlun, struct rw_semaphore *filesem, + ssize_t fsg_show_inquiry_string(struct fsg_lun *curlun, char *buf); + ssize_t fsg_show_cdrom(struct fsg_lun *curlun, char *buf); + ssize_t fsg_show_removable(struct fsg_lun *curlun, char *buf); ++ssize_t fsg_show_stats(struct fsg_lun *curlun, char *buf); + ssize_t fsg_store_ro(struct fsg_lun *curlun, struct rw_semaphore *filesem, + const char *buf, size_t count); + ssize_t fsg_store_nofua(struct fsg_lun *curlun, const char *buf, size_t count); +-- +2.7.4 + diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0074-media-aspeed-refine-HSYNC-VSYNC-polarity-setting-log.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0074-media-aspeed-refine-HSYNC-VSYNC-polarity-setting-log.patch new file mode 100644 index 000000000..4118e366c --- /dev/null +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0074-media-aspeed-refine-HSYNC-VSYNC-polarity-setting-log.patch @@ -0,0 +1,93 @@ +From 1032b062669b7ee041d2f5a9f4729953655efe61 Mon Sep 17 00:00:00 2001 +From: Jae Hyun Yoo <jae.hyun.yoo@intel.com> +Date: Wed, 4 Sep 2019 14:52:40 -0700 +Subject: [PATCH] media: aspeed: refine HSYNC/VSYNC polarity setting logic + +Sometimes it detects weird resolutions such as 1024x287 when the +actual resolution is 1280x768. To resolve this issue, this commit +refines HSYNC/VSYNC polarity setting code for mode detection by +clearing the bits as normal polarity at the beginning of the first +mode detection like datasheet suggested, and refines polarity +setting logic so that the bits can be set or cleared properly. + +Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> +--- + drivers/media/platform/aspeed-video.c | 45 ++++++++++++++++++----------------- + 1 file changed, 23 insertions(+), 22 deletions(-) + +diff --git a/drivers/media/platform/aspeed-video.c b/drivers/media/platform/aspeed-video.c +index 4ef37cfc8446..455c6af81236 100644 +--- a/drivers/media/platform/aspeed-video.c ++++ b/drivers/media/platform/aspeed-video.c +@@ -614,7 +614,7 @@ static void aspeed_video_check_and_set_polarity(struct aspeed_video *video) + int i; + int hsync_counter = 0; + int vsync_counter = 0; +- u32 sts; ++ u32 sts, ctrl; + + for (i = 0; i < NUM_POLARITY_CHECKS; ++i) { + sts = aspeed_video_read(video, VE_MODE_DETECT_STATUS); +@@ -629,30 +629,29 @@ static void aspeed_video_check_and_set_polarity(struct aspeed_video *video) + hsync_counter++; + } + +- if (hsync_counter < 0 || vsync_counter < 0) { +- u32 ctrl = 0; ++ ctrl = aspeed_video_read(video, VE_CTRL); + +- if (hsync_counter < 0) { +- ctrl = VE_CTRL_HSYNC_POL; +- video->detected_timings.polarities &= +- ~V4L2_DV_HSYNC_POS_POL; +- } else { +- video->detected_timings.polarities |= +- V4L2_DV_HSYNC_POS_POL; +- } +- +- if (vsync_counter < 0) { +- ctrl = VE_CTRL_VSYNC_POL; +- video->detected_timings.polarities &= +- ~V4L2_DV_VSYNC_POS_POL; +- } else { +- video->detected_timings.polarities |= +- V4L2_DV_VSYNC_POS_POL; +- } ++ if (hsync_counter < 0) { ++ ctrl |= VE_CTRL_HSYNC_POL; ++ video->detected_timings.polarities &= ++ ~V4L2_DV_HSYNC_POS_POL; ++ } else { ++ ctrl &= ~VE_CTRL_HSYNC_POL; ++ video->detected_timings.polarities |= ++ V4L2_DV_HSYNC_POS_POL; ++ } + +- if (ctrl) +- aspeed_video_update(video, VE_CTRL, 0, ctrl); ++ if (vsync_counter < 0) { ++ ctrl |= VE_CTRL_VSYNC_POL; ++ video->detected_timings.polarities &= ++ ~V4L2_DV_VSYNC_POS_POL; ++ } else { ++ ctrl &= ~VE_CTRL_VSYNC_POL; ++ video->detected_timings.polarities |= ++ V4L2_DV_VSYNC_POS_POL; + } ++ ++ aspeed_video_write(video, VE_CTRL, ctrl); + } + + static bool aspeed_video_alloc_buf(struct aspeed_video *video, +@@ -741,6 +740,8 @@ static void aspeed_video_get_resolution(struct aspeed_video *video) + } + + set_bit(VIDEO_RES_DETECT, &video->flags); ++ aspeed_video_update(video, VE_CTRL, ++ VE_CTRL_VSYNC_POL | VE_CTRL_HSYNC_POL, 0); + aspeed_video_enable_mode_detect(video); + + rc = wait_event_interruptible_timeout(video->wait, +-- +2.7.4 + diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0075-Refine-initialization-flow-in-I2C-driver.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0075-Refine-initialization-flow-in-I2C-driver.patch new file mode 100644 index 000000000..363f25368 --- /dev/null +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0075-Refine-initialization-flow-in-I2C-driver.patch @@ -0,0 +1,64 @@ +From a98e86429ce520cab3505c76ce02703837ef79b9 Mon Sep 17 00:00:00 2001 +From: Jae Hyun Yoo <jae.hyun.yoo@intel.com> +Date: Mon, 23 Sep 2019 13:48:49 -0700 +Subject: [PATCH] Refine initialization flow in I2C driver + +Since we enabled I2C busses in u-boot, we need to disable the I2C +bus and clear all garbage interrupts when kernel probes the bus. +This commit refines the initialization flow by adding a bus reset +at the beginning of probe function and by moving bus init function +after interrupt handling setup. + +Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> +--- + drivers/i2c/busses/i2c-aspeed.c | 20 +++++++++----------- + 1 file changed, 9 insertions(+), 11 deletions(-) + +diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c +index 0070366e9d6d..ab771a57a252 100644 +--- a/drivers/i2c/busses/i2c-aspeed.c ++++ b/drivers/i2c/busses/i2c-aspeed.c +@@ -1441,6 +1441,11 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) + if (IS_ERR(bus->base)) + return PTR_ERR(bus->base); + ++ /* Disable bus and clean up any left over interrupt state. */ ++ writel(0, bus->base + ASPEED_I2C_FUN_CTRL_REG); ++ writel(0, bus->base + ASPEED_I2C_INTR_CTRL_REG); ++ writel(0xffffffff, bus->base + ASPEED_I2C_INTR_STS_REG); ++ + parent_clk = devm_clk_get(&pdev->dev, NULL); + if (IS_ERR(parent_clk)) + return PTR_ERR(parent_clk); +@@ -1563,17 +1568,6 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) + + bus->dev = &pdev->dev; + +- /* Clean up any left over interrupt state. */ +- writel(0, bus->base + ASPEED_I2C_INTR_CTRL_REG); +- writel(0xffffffff, bus->base + ASPEED_I2C_INTR_STS_REG); +- /* +- * bus.lock does not need to be held because the interrupt handler has +- * not been enabled yet. +- */ +- ret = aspeed_i2c_init(bus, pdev); +- if (ret < 0) +- goto out_free_dma_buf; +- + irq = irq_of_parse_and_map(pdev->dev.of_node, 0); + ret = devm_request_irq(&pdev->dev, irq, aspeed_i2c_bus_irq, + 0, dev_name(&pdev->dev), bus); +@@ -1586,6 +1580,10 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) + + platform_set_drvdata(pdev, bus); + ++ ret = aspeed_i2c_init(bus, pdev); ++ if (ret < 0) ++ goto out_free_dma_buf; ++ + dev_info(bus->dev, "i2c bus %d registered (%s mode), irq %d\n", + bus->adap.nr, bus->dma_buf ? "dma" : + bus->buf_base ? "buffer" : "byte", +-- +2.7.4 + diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0076-media-aspeed-clear-garbage-interrupts.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0076-media-aspeed-clear-garbage-interrupts.patch new file mode 100644 index 000000000..0cf9913fe --- /dev/null +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0076-media-aspeed-clear-garbage-interrupts.patch @@ -0,0 +1,74 @@ +From 5f89fa4b6468771b5de6e73454bf0ea546249b7b Mon Sep 17 00:00:00 2001 +From: Jae Hyun Yoo <jae.hyun.yoo@intel.com> +Date: Thu, 26 Sep 2019 12:15:23 -0700 +Subject: [PATCH] media: aspeed: clear garbage interrupts + +CAPTURE_COMPLETE and FRAME_COMPLETE interrupts come even when these +are disabled in the VE_INTERRUPT_CTRL register and eventually this +behavior causes disabling irq itself like below: + +[10055.108784] irq 23: nobody cared (try booting with the "irqpoll" option) +[10055.115525] CPU: 0 PID: 331 Comm: swampd Tainted: G W 5.3.0-4fde000-dirty-d683e2e #1 +[10055.124565] Hardware name: Generic DT based system +[10055.129355] Backtrace: +[10055.131854] [<80107d7c>] (dump_backtrace) from [<80107fb0>] (show_stack+0x20/0x24) +[10055.139431] r7:00000017 r6:00000001 r5:00000000 r4:9d51dc00 +[10055.145120] [<80107f90>] (show_stack) from [<8074bf50>] (dump_stack+0x20/0x28) +[10055.152361] [<8074bf30>] (dump_stack) from [<80150ffc>] (__report_bad_irq+0x40/0xc0) +[10055.160109] [<80150fbc>] (__report_bad_irq) from [<80150f2c>] (note_interrupt+0x23c/0x294) +[10055.168374] r9:015b6e60 r8:00000000 r7:00000017 r6:00000001 r5:00000000 r4:9d51dc00 +[10055.176136] [<80150cf0>] (note_interrupt) from [<8014df1c>] (handle_irq_event_percpu+0x88/0x98) +[10055.184835] r10:7eff7910 r9:015b6e60 r8:00000000 r7:9d417600 r6:00000001 r5:00000002 +[10055.192657] r4:9d51dc00 r3:00000000 +[10055.196248] [<8014de94>] (handle_irq_event_percpu) from [<8014df64>] (handle_irq_event+0x38/0x4c) +[10055.205113] r5:80b56d50 r4:9d51dc00 +[10055.208697] [<8014df2c>] (handle_irq_event) from [<80151f1c>] (handle_level_irq+0xbc/0x12c) +[10055.217037] r5:80b56d50 r4:9d51dc00 +[10055.220623] [<80151e60>] (handle_level_irq) from [<8014d4b8>] (generic_handle_irq+0x30/0x44) +[10055.229052] r5:80b56d50 r4:00000017 +[10055.232648] [<8014d488>] (generic_handle_irq) from [<8014d524>] (__handle_domain_irq+0x58/0xb4) +[10055.241356] [<8014d4cc>] (__handle_domain_irq) from [<801021e4>] (avic_handle_irq+0x68/0x70) +[10055.249797] r9:015b6e60 r8:00c5387d r7:00c5387d r6:ffffffff r5:9dd33fb0 r4:9d402380 +[10055.257539] [<8010217c>] (avic_handle_irq) from [<80101e34>] (__irq_usr+0x54/0x80) +[10055.265105] Exception stack(0x9dd33fb0 to 0x9dd33ff8) +[10055.270152] 3fa0: 015d0530 00000000 00000000 015d0538 +[10055.278328] 3fc0: 015d0530 015b6e60 00000000 00000000 0052c5d0 015b6e60 7eff7910 7eff7918 +[10055.286496] 3fe0: 76ce5614 7eff7908 0050e2f4 76a3a08c 20000010 ffffffff +[10055.293104] r5:20000010 r4:76a3a08c +[10055.296673] handlers: +[10055.298967] [<79f218a5>] irq_default_primary_handler threaded [<1de88514>] aspeed_video_irq +[10055.307344] Disabling IRQ #23 + +To fix this issue, this commit makes the interrupt handler clear +these garbage interrupts. This driver enables and uses only +COMP_COMPLETE interrupt. + +Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> +--- + drivers/media/platform/aspeed-video.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/drivers/media/platform/aspeed-video.c b/drivers/media/platform/aspeed-video.c +index 455c6af81236..0473f3141329 100644 +--- a/drivers/media/platform/aspeed-video.c ++++ b/drivers/media/platform/aspeed-video.c +@@ -606,6 +606,16 @@ static irqreturn_t aspeed_video_irq(int irq, void *arg) + aspeed_video_start_frame(video); + } + ++ /* ++ * CAPTURE_COMPLETE and FRAME_COMPLETE interrupts come even when these ++ * are disabled in the VE_INTERRUPT_CTRL register so clear them to ++ * prevent unnecessary interrupt calls. ++ */ ++ if (sts & VE_INTERRUPT_CAPTURE_COMPLETE) ++ sts &= ~VE_INTERRUPT_CAPTURE_COMPLETE; ++ if (sts & VE_INTERRUPT_FRAME_COMPLETE) ++ sts &= ~VE_INTERRUPT_FRAME_COMPLETE; ++ + return sts ? IRQ_NONE : IRQ_HANDLED; + } + +-- +2.7.4 + diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/intel.cfg b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/intel.cfg index 41530dd6e..2a4e87d80 100644 --- a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/intel.cfg +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/intel.cfg @@ -1 +1,74 @@ CONFIG_BLK_DEV_RAM=y +CONFIG_HWMON=y +CONFIG_SENSORS_ASPEED=y +CONFIG_SPI=y +CONFIG_SPI_MASTER=y +CONFIG_IIO=y +CONFIG_SENSORS_IIO_HWMON=y +CONFIG_ASPEED_ADC=y +CONFIG_SGPIO_ASPEED=y +CONFIG_CRC8=y +CONFIG_PECI=y +CONFIG_PECI_CHARDEV=y +CONFIG_PECI_ASPEED=y +CONFIG_SENSORS_PECI_CPUTEMP=y +CONFIG_SENSORS_PECI_DIMMTEMP=y +CONFIG_CONFIGFS_FS=y +CONFIG_BLK_DEV_RAM_SIZE=49152 +CONFIG_MAGIC_SYSRQ=y +CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x01 +CONFIG_MAGIC_SYSRQ_SERIAL=y +CONFIG_ASPEED_ESPI_SLAVE=y +CONFIG_ASPEED_KCS_IPMI_BMC=y +CONFIG_I2C_SLAVE=y +CONFIG_I2C_SLAVE_MQUEUE=y +CONFIG_I2C_SLAVE_MQUEUE_MESSAGE_SIZE=256 +CONFIG_I2C_SLAVE_MQUEUE_QUEUE_SIZE=32 +CONFIG_ASPEED_BT_IPMI_BMC=n +CONFIG_ASPEED_LPC_CTRL=n +CONFIG_ASPEED_LPC_MBOX=y +CONFIG_ASPEED_LPC_SIO=y +CONFIG_JTAG=y +CONFIG_JTAG_ASPEED=y +CONFIG_FRAME_VECTOR=y +CONFIG_MEDIA_SUPPORT=y +CONFIG_MEDIA_CAMERA_SUPPORT=y +CONFIG_VIDEO_DEV=y +CONFIG_VIDEO_V4L2=y +CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_VIDEO_ASPEED=y +CONFIG_VIDEOBUF2_CORE=y +CONFIG_VIDEOBUF2_V4L2=y +CONFIG_VIDEOBUF2_MEMOPS=y +CONFIG_VIDEOBUF2_DMA_CONTIG=y +CONFIG_MEDIA_SUBDRV_AUTOSELECT=y +CONFIG_USB_GADGET_VBUS_DRAW=2 +CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 +CONFIG_USB_LIBCOMPOSITE=y +CONFIG_USB_F_HID=y +CONFIG_USB_GADGET=y +CONFIG_U_SERIAL_CONSOLE=y +CONFIG_USB_ASPEED_VHUB=y +CONFIG_USB_CONFIGFS=y +CONFIG_USB_CONFIGFS_MASS_STORAGE=y +CONFIG_USB_CONFIGFS_F_FS=y +CONFIG_USB_CONFIGFS_F_HID=y +CONFIG_ASPEED_UART_ROUTING=y +CONFIG_ASPEED_VGA_SHAREDMEM=y +CONFIG_PWM=y +CONFIG_PWM_FTTMR010=y +CONFIG_INPUT_MISC=y +CONFIG_INPUT_PWM_BEEPER=y +CONFIG_VFAT_FS=y +CONFIG_NLS=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +CONFIG_NLS_ISO8859_15=y +CONFIG_NLS_UTF8=y +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_CIFS=y +CONFIG_CIFS_XATTR=y +CONFIG_PSTORE=y +CONFIG_PSTORE_ZLIB_COMPRESS=y +CONFIG_PSTORE_RAM=y |