From f8d364be6a88e72a849ecd464f5f1dfda3289124 Mon Sep 17 00:00:00 2001 From: maoxiaochuan Date: Tue, 20 Aug 2024 14:54:27 +0800 Subject: [PATCH] update to 5eee671596dd3 1. sound/soc/codec: Remove Configure from driver, Switch Codec to Master Mode 2. drivers/net/can: ls_canfd: Add driver elf file 3. 2K300: defconfig: 2k300 add LS_CANFD Support 4. 2K300-PAI: Add a common dtsi file named ls2k300-pai-common.dtsi, the ls2k300_pai_xxx.dts files can include it. --- .../boot/dts/loongson/loongson2p500.dtsi | 2 - .../boot/dts/loongson/ls2k300_pai.dts | 242 +--------------- .../boot/dts/loongson/ls2k300_pai_common.dtsi | 265 ++++++++++++++++++ .../boot/dts/loongson/ls2k300_pai_func2.dts | 241 +--------------- .../boot/dts/loongson/ls2k300_pai_pihat.dts | 240 +--------------- .../configs/loongson_2k300_defconfig | 2 + drivers/net/can/Kconfig | 1 + drivers/net/can/Makefile | 1 + drivers/net/can/ls_canfd/Kconfig | 18 ++ drivers/net/can/ls_canfd/Makefile | 13 + drivers/net/can/ls_canfd/lscanfd_dma.elfbin | Bin 0 -> 97864 bytes .../net/can/ls_canfd/lscanfd_platform.elfbin | Bin 0 -> 14336 bytes sound/soc/codecs/es8328.c | 53 ++-- sound/soc/loongson/ls-i2s.c | 3 +- sound/soc/loongson/ls-sound-es8388.c | 7 +- 15 files changed, 327 insertions(+), 761 deletions(-) create mode 100644 arch/loongarch/boot/dts/loongson/ls2k300_pai_common.dtsi create mode 100644 drivers/net/can/ls_canfd/Kconfig create mode 100644 drivers/net/can/ls_canfd/Makefile create mode 100644 drivers/net/can/ls_canfd/lscanfd_dma.elfbin create mode 100644 drivers/net/can/ls_canfd/lscanfd_platform.elfbin diff --git a/arch/loongarch/boot/dts/loongson/loongson2p500.dtsi b/arch/loongarch/boot/dts/loongson/loongson2p500.dtsi index 0afc7e3a3..e09b35cd5 100644 --- a/arch/loongarch/boot/dts/loongson/loongson2p500.dtsi +++ b/arch/loongarch/boot/dts/loongson/loongson2p500.dtsi @@ -497,8 +497,6 @@ clock-frequency = <0 200000000>; dma-mask = <0xffffffff 0xffffffff>; bus-width = <1>; - cap-sd-highspeed; - cap-mmc-highspeed; //no-mmc; status = "disabled"; }; diff --git a/arch/loongarch/boot/dts/loongson/ls2k300_pai.dts b/arch/loongarch/boot/dts/loongson/ls2k300_pai.dts index 73a5a73dd..b765259e0 100644 --- a/arch/loongarch/boot/dts/loongson/ls2k300_pai.dts +++ b/arch/loongarch/boot/dts/loongson/ls2k300_pai.dts @@ -3,139 +3,7 @@ #include #include -#include "loongson2k300.dtsi" -#include "loongson_panel_param.dtsi" - -/ { - model = "LS2K300-PAI"; - - chosen { - stdout-path = "serial0:115200n8"; - bootargs = "earlycon"; - }; - - /* not need memory node, we get memory info from boot params. */ - //memory { - // name = "memory"; - // device_type = "memory"; - // reg = <0 0x00200000 0 0x0ee00000 - // 0 0x90000000 0 0x10000000>; - //}; - - reserved-memory { - #address-cells = <2>; - #size-cells = <2>; - ranges; - - linux,cma { - compatible = "shared-dma-pool"; - reusable; - size = <0 0x02000000>; - linux,cma-default; - }; - }; - - leds { - compatible = "gpio-leds"; - - led1 { - label = "led1"; - gpios = <&gpio 54 GPIO_ACTIVE_LOW>; - linux,default-trigger = "heartbeat"; - default-state = "on"; - }; - }; - - lcd_backlight: backlight { - compatible = "gpio-backlight"; - gpios = <&gpio 43 GPIO_ACTIVE_HIGH>; - default-on; - }; - - panel: dvo-connector@0 { - #address-cells = <1>; - #size-cells = <0>; - compatible = "panel-lvds", "auo,b101ean01"; - backlight = <&lcd_backlight>; - - /* lcd power on control gpio */ - // enable-gpios = <&pioA 3 GPIO_ACTIVE_HIGH>; - // power-supply = <&vdd_lcd>; -#if 0 // 4.3' LCD - width-mm = <223>; - height-mm = <125>; - label = "ATK-MD0430R-800x480"; - data-mapping = "jeida-24"; - - panel-timing { - clock-frequency = <27000000>; - hactive = <800>; - vactive = <480>; - hsync-len = <40>; - hfront-porch = <48>; - hback-porch = <40>; - vfront-porch = <13>; - vback-porch = <32>; - vsync-len = <1>; - de-active = <1>; - hsync-active = <0>; - vsync-active = <0>; - pixelclk-active = <0>; - }; -#else // 7' LCD - width-mm = <223>; - height-mm = <125>; - label = "ATK-MD0700R-1024x600"; - data-mapping = "jeida-24"; - - panel-timing { - clock-frequency = <51200000>; - hactive = <1024>; - vactive = <600>; - hsync-len = <20>; - hfront-porch = <160>; - hback-porch = <140>; - vfront-porch = <12>; - vback-porch = <20>; - vsync-len = <3>; - de-active = <1>; - hsync-active = <0>; - vsync-active = <0>; - pixelclk-active = <0>; - }; -#endif - port@0 { - reg = <0>; - - #address-cells = <1>; - #size-cells = <0>; - - dvo_connector_in: endpoint@0 { - reg = <0>; - remote-endpoint = <&dc_out_rgb0>; - }; - }; - }; - - vccio_codec: 3_3V{ - compatible = "regulator-fixed"; - regulator-name = "VCC_IO"; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - regulator-always-on; - }; - - // 虽然这个时钟在从模式下没用,但 es8388 驱动必须指定这个时钟 - es8388_clk: es8388-clock { - compatible = "fixed-clock"; - clock-frequency = <11289600>; - #clock-cells = <1>; - }; -}; - -&uart0 { - status = "okay"; -}; +#include "ls2k300_pai_common.dtsi" &uart2 { status = "ok"; @@ -157,16 +25,6 @@ status = "disabled"; }; -&spi0 { - status = "okay"; - - spi-flash@0 { - compatible = "jedec,spi-nor"; - spi-max-frequency = <25000000>; - reg = <0>; - }; -}; - &spi1 { status = "okay"; @@ -197,74 +55,6 @@ }; }; -&gmac0 { - status = "okay"; - phy-handle = <&yt8511h0>; - mdio { - compatible = "snps,dwmac-mdio"; - #address-cells = <1>; - #size-cells = <0>; - - yt8511h0: ethernet-phy@0 { - compatible = "ethernet-phy-ieee802.3-c22"; - reg = <0>; - motorcomm,led0_cfg = <0x40>; //千兆常亮 - motorcomm,led1_cfg = <0x30>; //百兆 十兆常亮 - motorcomm,led2_cfg = <0x2600>; //有数据时闪烁 - }; - }; -}; - -&dc { - status = "ok"; - - ports { - #address-cells = <1>; - #size-cells = <0>; - - port@0 { - reg = <0>; - dc_out_rgb0: endpoint { - remote-endpoint = <&dvo_connector_in>; - }; - }; - }; -}; - -&i2c0 { - status = "ok"; - - touchpad: gt9147@14 { - compatible = "goodix,gt9147"; - reg = <0x14>; - // 2K300 GPIO 支持中断控制 - // GPIO 中断号为 vhwirq-base + pinnum (170 = 128 + 42) - interrupt-parent = <&gpio>; - interrupts = <170 IRQ_TYPE_EDGE_FALLING>; - irq-gpios = <&gpio 42 GPIO_ACTIVE_LOW>; - reset-gpios = <&gpio 55 GPIO_ACTIVE_LOW>; - }; -}; - -&i2c1 { - status = "ok"; -}; - -&i2c2 { - status = "okay"; - - codec: es8388@11{ - compatible = "everest,es8388"; - reg = <0x11>; - AVDD-supply = <&vccio_codec>; - DVDD-supply = <&vccio_codec>; - HPVDD-supply = <&vccio_codec>; - PVDD-supply = <&vccio_codec>; - clocks = <&es8388_clk 0>; - }; -}; - - &can0 { status = "disabled"; }; @@ -281,36 +71,6 @@ status = "disabled"; }; -&adc { - status = "okay"; -}; - -&rtc0 { - status = "okay"; -}; - -&sdio1 { - pinctrl-0 = <&sdio1_pins>; - pinctrl-names = "default"; - cap-sd-highspeed; - cap-mmc-highspeed; - bus-width = <4>; - cd-gpios = <&gpio 82 GPIO_ACTIVE_LOW>; - status = "okay"; -}; - -&i2s { - status = "okay"; -}; - -&audio { - status = "okay"; -}; - -&sound { - status = "okay"; -}; - &pwm0 { status = "okay"; }; diff --git a/arch/loongarch/boot/dts/loongson/ls2k300_pai_common.dtsi b/arch/loongarch/boot/dts/loongson/ls2k300_pai_common.dtsi new file mode 100644 index 000000000..d8f7a5c13 --- /dev/null +++ b/arch/loongarch/boot/dts/loongson/ls2k300_pai_common.dtsi @@ -0,0 +1,265 @@ +#include +#include +#include +#include + +#include "loongson2k300.dtsi" +#include "loongson_panel_param.dtsi" + +/ { + model = "LS2K300-PAI"; + + chosen { + stdout-path = "serial0:115200n8"; + bootargs = "earlycon"; + }; + + /* not need memory node, we get memory info from boot params. */ + //memory { + // name = "memory"; + // device_type = "memory"; + // reg = <0 0x00200000 0 0x0ee00000 + // 0 0x90000000 0 0x10000000>; + //}; + + reserved-memory { + #address-cells = <2>; + #size-cells = <2>; + ranges; + + linux,cma { + compatible = "shared-dma-pool"; + reusable; + size = <0 0x02000000>; + linux,cma-default; + }; + }; + + leds { + compatible = "gpio-leds"; + + led1 { + label = "led1"; + gpios = <&gpio 54 GPIO_ACTIVE_LOW>; + linux,default-trigger = "heartbeat"; + default-state = "on"; + }; + }; + + lcd_backlight: backlight { + compatible = "gpio-backlight"; + gpios = <&gpio 43 GPIO_ACTIVE_HIGH>; + default-on; + }; + + panel: dvo-connector@0 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "panel-lvds", "auo,b101ean01"; + backlight = <&lcd_backlight>; + + /* lcd power on control gpio */ + // enable-gpios = <&pioA 3 GPIO_ACTIVE_HIGH>; + // power-supply = <&vdd_lcd>; +#if 0 // 4.3' LCD + width-mm = <223>; + height-mm = <125>; + label = "ATK-MD0430R-800x480"; + data-mapping = "jeida-24"; + + panel-timing { + clock-frequency = <27000000>; + hactive = <800>; + vactive = <480>; + hsync-len = <40>; + hfront-porch = <48>; + hback-porch = <40>; + vfront-porch = <13>; + vback-porch = <32>; + vsync-len = <1>; + de-active = <1>; + hsync-active = <0>; + vsync-active = <0>; + pixelclk-active = <0>; + }; +#else // 7' LCD + width-mm = <223>; + height-mm = <125>; + label = "ATK-MD0700R-1024x600"; + data-mapping = "jeida-24"; + + panel-timing { + clock-frequency = <51200000>; + hactive = <1024>; + vactive = <600>; + hsync-len = <20>; + hfront-porch = <160>; + hback-porch = <140>; + vfront-porch = <12>; + vback-porch = <20>; + vsync-len = <3>; + de-active = <1>; + hsync-active = <0>; + vsync-active = <0>; + pixelclk-active = <0>; + }; +#endif + port@0 { + reg = <0>; + + #address-cells = <1>; + #size-cells = <0>; + + dvo_connector_in: endpoint@0 { + reg = <0>; + remote-endpoint = <&dc_out_rgb0>; + }; + }; + }; + + vccio_codec: 3_3V{ + compatible = "regulator-fixed"; + regulator-name = "VCC_IO"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-always-on; + }; + + // 虽然这个时钟在从模式下没用,但 es8388 驱动必须指定这个时钟 + es8388_clk: es8388-clock { + compatible = "fixed-clock"; + clock-frequency = <12288000>; + #clock-cells = <1>; + }; +}; + +&uart0 { + status = "okay"; +}; + +&spi0 { + status = "okay"; + + spi-flash@0 { + compatible = "jedec,spi-nor"; + spi-max-frequency = <25000000>; + reg = <0>; + }; +}; + +&gmac0 { + status = "okay"; + phy-handle = <&yt8511h0>; + mdio { + compatible = "snps,dwmac-mdio"; + #address-cells = <1>; + #size-cells = <0>; + + yt8511h0: ethernet-phy@0 { + compatible = "ethernet-phy-ieee802.3-c22"; + reg = <0>; + motorcomm,led0_cfg = <0x40>; //千兆常亮 + motorcomm,led1_cfg = <0x30>; //百兆 十兆常亮 + motorcomm,led2_cfg = <0x2600>; //有数据时闪烁 + }; + }; +}; + +&dc { + status = "ok"; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + dc_out_rgb0: endpoint { + remote-endpoint = <&dvo_connector_in>; + }; + }; + }; +}; + +&i2c0 { + status = "ok"; + + touchpad: gt9147@14 { + compatible = "goodix,gt9147"; + reg = <0x14>; + // 2K300 GPIO 支持中断控制 + // GPIO 中断号为 vhwirq-base + pinnum (170 = 128 + 42) + interrupt-parent = <&gpio>; + interrupts = <170 IRQ_TYPE_EDGE_FALLING>; + irq-gpios = <&gpio 42 GPIO_ACTIVE_LOW>; + reset-gpios = <&gpio 55 GPIO_ACTIVE_LOW>; + }; +}; + +&i2c1 { + status = "ok"; +}; + +&i2c2 { + status = "okay"; + + codec: es8388@11{ + compatible = "everest,es8388"; + reg = <0x11>; + AVDD-supply = <&vccio_codec>; + DVDD-supply = <&vccio_codec>; + HPVDD-supply = <&vccio_codec>; + PVDD-supply = <&vccio_codec>; + clocks = <&es8388_clk 0>; + }; +}; + + +&can0 { + status = "disabled"; +}; + +&can1 { + status = "disabled"; +}; + +&can2 { + status = "disabled"; +}; + +&can3 { + status = "disabled"; +}; + +&adc { + status = "okay"; +}; + +&rtc0 { + status = "okay"; +}; + +&sdio1 { + pinctrl-0 = <&sdio1_pins>; + pinctrl-names = "default"; + cap-sd-highspeed; + cap-mmc-highspeed; + bus-width = <4>; + cd-gpios = <&gpio 82 GPIO_ACTIVE_LOW>; + status = "okay"; +}; + +&i2s { + status = "okay"; + slave-mode; + mclk-fixed = <12288000>; +}; + +&audio { + status = "okay"; +}; + +&sound { + status = "okay"; +}; + diff --git a/arch/loongarch/boot/dts/loongson/ls2k300_pai_func2.dts b/arch/loongarch/boot/dts/loongson/ls2k300_pai_func2.dts index bb724ee1e..eafac702e 100644 --- a/arch/loongarch/boot/dts/loongson/ls2k300_pai_func2.dts +++ b/arch/loongarch/boot/dts/loongson/ls2k300_pai_func2.dts @@ -3,139 +3,7 @@ #include #include -#include "loongson2k300.dtsi" -#include "loongson_panel_param.dtsi" - -/ { - model = "LS2K300-PAI"; - - chosen { - stdout-path = "serial0:115200n8"; - bootargs = "earlycon"; - }; - - /* not need memory node, we get memory info from boot params. */ - //memory { - // name = "memory"; - // device_type = "memory"; - // reg = <0 0x00200000 0 0x0ee00000 - // 0 0x90000000 0 0x10000000>; - //}; - - reserved-memory { - #address-cells = <2>; - #size-cells = <2>; - ranges; - - linux,cma { - compatible = "shared-dma-pool"; - reusable; - size = <0 0x02000000>; - linux,cma-default; - }; - }; - - leds { - compatible = "gpio-leds"; - - led1 { - label = "led1"; - gpios = <&gpio 54 GPIO_ACTIVE_LOW>; - linux,default-trigger = "heartbeat"; - default-state = "on"; - }; - }; - - lcd_backlight: backlight { - compatible = "gpio-backlight"; - gpios = <&gpio 43 GPIO_ACTIVE_HIGH>; - default-on; - }; - - panel: dvo-connector@0 { - #address-cells = <1>; - #size-cells = <0>; - compatible = "panel-lvds", "auo,b101ean01"; - backlight = <&lcd_backlight>; - - /* lcd power on control gpio */ - // enable-gpios = <&pioA 3 GPIO_ACTIVE_HIGH>; - // power-supply = <&vdd_lcd>; -#if 0 // 4.3' LCD - width-mm = <223>; - height-mm = <125>; - label = "ATK-MD0430R-800x480"; - data-mapping = "jeida-24"; - - panel-timing { - clock-frequency = <27000000>; - hactive = <800>; - vactive = <480>; - hsync-len = <40>; - hfront-porch = <48>; - hback-porch = <40>; - vfront-porch = <13>; - vback-porch = <32>; - vsync-len = <1>; - de-active = <1>; - hsync-active = <0>; - vsync-active = <0>; - pixelclk-active = <0>; - }; -#else // 7' LCD - width-mm = <223>; - height-mm = <125>; - label = "ATK-MD0700R-1024x600"; - data-mapping = "jeida-24"; - - panel-timing { - clock-frequency = <51200000>; - hactive = <1024>; - vactive = <600>; - hsync-len = <20>; - hfront-porch = <160>; - hback-porch = <140>; - vfront-porch = <12>; - vback-porch = <20>; - vsync-len = <3>; - de-active = <1>; - hsync-active = <0>; - vsync-active = <0>; - pixelclk-active = <0>; - }; -#endif - port@0 { - reg = <0>; - - #address-cells = <1>; - #size-cells = <0>; - - dvo_connector_in: endpoint@0 { - reg = <0>; - remote-endpoint = <&dc_out_rgb0>; - }; - }; - }; - - vccio_codec: 3_3V{ - compatible = "regulator-fixed"; - regulator-name = "VCC_IO"; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - regulator-always-on; - }; - - // 虽然这个时钟在从模式下没用,但 es8388 驱动必须指定这个时钟 - es8388_clk: es8388-clock { - compatible = "fixed-clock"; - clock-frequency = <11289600>; - #clock-cells = <1>; - }; -}; - -&uart0 { - status = "okay"; -}; +#include "ls2k300_pai_common.dtsi" &uart2 { status = "okay"; @@ -165,16 +33,6 @@ status = "okay"; }; -&spi0 { - status = "okay"; - - spi-flash@0 { - compatible = "jedec,spi-nor"; - spi-max-frequency = <25000000>; - reg = <0>; - }; -}; - &spi1 { status = "disabled"; }; @@ -183,74 +41,6 @@ status = "disabled"; }; -&gmac0 { - status = "okay"; - phy-handle = <&yt8511h0>; - mdio { - compatible = "snps,dwmac-mdio"; - #address-cells = <1>; - #size-cells = <0>; - - yt8511h0: ethernet-phy@0 { - compatible = "ethernet-phy-ieee802.3-c22"; - reg = <0>; - motorcomm,led0_cfg = <0x40>; //千兆常亮 - motorcomm,led1_cfg = <0x30>; //百兆 十兆常亮 - motorcomm,led2_cfg = <0x2600>; //有数据时闪烁 - }; - }; -}; - -&dc { - status = "ok"; - - ports { - #address-cells = <1>; - #size-cells = <0>; - - port@0 { - reg = <0>; - dc_out_rgb0: endpoint { - remote-endpoint = <&dvo_connector_in>; - }; - }; - }; -}; - -&i2c0 { - status = "ok"; - - touchpad: gt9147@14 { - compatible = "goodix,gt9147"; - reg = <0x14>; - // 2K300 GPIO 支持中断控制 - // GPIO 中断号为 vhwirq-base + pinnum (170 = 128 + 42) - interrupt-parent = <&gpio>; - interrupts = <170 IRQ_TYPE_EDGE_FALLING>; - irq-gpios = <&gpio 42 GPIO_ACTIVE_LOW>; - reset-gpios = <&gpio 55 GPIO_ACTIVE_LOW>; - }; -}; - -&i2c1 { - status = "ok"; -}; - -&i2c2 { - status = "okay"; - - codec: es8388@11{ - compatible = "everest,es8388"; - reg = <0x11>; - AVDD-supply = <&vccio_codec>; - DVDD-supply = <&vccio_codec>; - HPVDD-supply = <&vccio_codec>; - PVDD-supply = <&vccio_codec>; - clocks = <&es8388_clk 0>; - }; -}; - - &can0 { status = "okay"; }; @@ -267,32 +57,3 @@ status = "okay"; }; -&adc { - status = "okay"; -}; - -&rtc0 { - status = "okay"; -}; - -&sdio1 { - pinctrl-0 = <&sdio1_pins>; - pinctrl-names = "default"; - cap-sd-highspeed; - cap-mmc-highspeed; - bus-width = <4>; - cd-gpios = <&gpio 82 GPIO_ACTIVE_LOW>; - status = "okay"; -}; - -&i2s { - status = "okay"; -}; - -&audio { - status = "okay"; -}; - -&sound { - status = "okay"; -}; diff --git a/arch/loongarch/boot/dts/loongson/ls2k300_pai_pihat.dts b/arch/loongarch/boot/dts/loongson/ls2k300_pai_pihat.dts index 554d41b6b..d9d6cb2cd 100644 --- a/arch/loongarch/boot/dts/loongson/ls2k300_pai_pihat.dts +++ b/arch/loongarch/boot/dts/loongson/ls2k300_pai_pihat.dts @@ -3,151 +3,21 @@ #include #include -#include "loongson2k300.dtsi" -#include "loongson_panel_param.dtsi" +#include "ls2k300_pai_common.dtsi" / { - model = "LS2K300-PAI"; - - chosen { - stdout-path = "serial0:115200n8"; - bootargs = "earlycon"; - }; - - /* not need memory node, we get memory info from boot params. */ - //memory { - // name = "memory"; - // device_type = "memory"; - // reg = <0 0x00200000 0 0x0ee00000 - // 0 0x90000000 0 0x10000000>; - //}; - - reserved-memory { - #address-cells = <2>; - #size-cells = <2>; - ranges; - - linux,cma { - compatible = "shared-dma-pool"; - reusable; - size = <0 0x02000000>; - linux,cma-default; - }; - }; - - leds { - compatible = "gpio-leds"; - - led1 { - label = "led1"; - gpios = <&gpio 54 GPIO_ACTIVE_LOW>; - linux,default-trigger = "heartbeat"; - default-state = "on"; - }; - }; - - lcd_backlight: backlight { - compatible = "gpio-backlight"; - gpios = <&gpio 43 GPIO_ACTIVE_HIGH>; - default-on; - }; - - panel: dvo-connector@0 { - #address-cells = <1>; - #size-cells = <0>; - compatible = "panel-lvds", "auo,b101ean01"; - backlight = <&lcd_backlight>; - - /* lcd power on control gpio */ - // enable-gpios = <&pioA 3 GPIO_ACTIVE_HIGH>; - // power-supply = <&vdd_lcd>; -#if 0 // 4.3' LCD - width-mm = <223>; - height-mm = <125>; - label = "ATK-MD0430R-800x480"; - data-mapping = "jeida-24"; - - panel-timing { - clock-frequency = <27000000>; - hactive = <800>; - vactive = <480>; - hsync-len = <40>; - hfront-porch = <48>; - hback-porch = <40>; - vfront-porch = <13>; - vback-porch = <32>; - vsync-len = <1>; - de-active = <1>; - hsync-active = <0>; - vsync-active = <0>; - pixelclk-active = <0>; - }; -#else // 7' LCD - width-mm = <223>; - height-mm = <125>; - label = "ATK-MD0700R-1024x600"; - data-mapping = "jeida-24"; - - panel-timing { - clock-frequency = <51200000>; - hactive = <1024>; - vactive = <600>; - hsync-len = <20>; - hfront-porch = <160>; - hback-porch = <140>; - vfront-porch = <12>; - vback-porch = <20>; - vsync-len = <3>; - de-active = <1>; - hsync-active = <0>; - vsync-active = <0>; - pixelclk-active = <0>; - }; -#endif - port@0 { - reg = <0>; - - #address-cells = <1>; - #size-cells = <0>; - - dvo_connector_in: endpoint@0 { - reg = <0>; - remote-endpoint = <&dc_out_rgb0>; - }; - }; - }; - - vccio_codec: 3_3V{ - compatible = "regulator-fixed"; - regulator-name = "VCC_IO"; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - regulator-always-on; - }; - humidity_sensor { compatible = "dht11-sensor"; SHT11-gpios = <&gpio 61 GPIO_ACTIVE_HIGH>; status = "okay"; }; - // 虽然这个时钟在从模式下没用,但 es8388 驱动必须指定这个时钟 - es8388_clk: es8388-clock { - compatible = "fixed-clock"; - clock-frequency = <11289600>; - #clock-cells = <1>; - }; - onewire { compatible = "w1-gpio"; gpios = <&gpio 68 GPIO_ACTIVE_HIGH>; }; }; -&uart0 { - status = "okay"; -}; - &uart2 { status = "ok"; }; @@ -168,16 +38,6 @@ status = "disabled"; }; -&spi0 { - status = "okay"; - - spi-flash@0 { - compatible = "jedec,spi-nor"; - spi-max-frequency = <25000000>; - reg = <0>; - }; -}; - &spi1 { status = "okay"; @@ -209,74 +69,6 @@ }; }; -&gmac0 { - status = "okay"; - phy-handle = <&yt8511h0>; - mdio { - compatible = "snps,dwmac-mdio"; - #address-cells = <1>; - #size-cells = <0>; - - yt8511h0: ethernet-phy@0 { - compatible = "ethernet-phy-ieee802.3-c22"; - reg = <0>; - motorcomm,led0_cfg = <0x40>; //千兆常亮 - motorcomm,led1_cfg = <0x30>; //百兆 十兆常亮 - motorcomm,led2_cfg = <0x2600>; //有数据时闪烁 - }; - }; -}; - -&dc { - status = "ok"; - - ports { - #address-cells = <1>; - #size-cells = <0>; - - port@0 { - reg = <0>; - dc_out_rgb0: endpoint { - remote-endpoint = <&dvo_connector_in>; - }; - }; - }; -}; - -&i2c0 { - status = "ok"; - - touchpad: gt9147@14 { - compatible = "goodix,gt9147"; - reg = <0x14>; - // 2K300 GPIO 支持中断控制 - // GPIO 中断号为 vhwirq-base + pinnum (170 = 128 + 42) - interrupt-parent = <&gpio>; - interrupts = <170 IRQ_TYPE_EDGE_FALLING>; - irq-gpios = <&gpio 42 GPIO_ACTIVE_LOW>; - reset-gpios = <&gpio 55 GPIO_ACTIVE_LOW>; - }; -}; - -&i2c1 { - status = "ok"; -}; - -&i2c2 { - status = "okay"; - - codec: es8388@11{ - compatible = "everest,es8388"; - reg = <0x11>; - AVDD-supply = <&vccio_codec>; - DVDD-supply = <&vccio_codec>; - HPVDD-supply = <&vccio_codec>; - PVDD-supply = <&vccio_codec>; - clocks = <&es8388_clk 0>; - }; -}; - - &can0 { status = "disabled"; }; @@ -292,33 +84,3 @@ &can3 { status = "disabled"; }; - -&adc { - status = "okay"; -}; - -&rtc0 { - status = "okay"; -}; - -&sdio1 { - pinctrl-0 = <&sdio1_pins>; - pinctrl-names = "default"; - cap-sd-highspeed; - cap-mmc-highspeed; - bus-width = <4>; - cd-gpios = <&gpio 82 GPIO_ACTIVE_LOW>; - status = "okay"; -}; - -&i2s { - status = "okay"; -}; - -&audio { - status = "okay"; -}; - -&sound { - status = "okay"; -}; diff --git a/arch/loongarch/configs/loongson_2k300_defconfig b/arch/loongarch/configs/loongson_2k300_defconfig index 522213461..dfe37250b 100644 --- a/arch/loongarch/configs/loongson_2k300_defconfig +++ b/arch/loongarch/configs/loongson_2k300_defconfig @@ -203,6 +203,8 @@ CONFIG_NETLINK_DIAG=y CONFIG_CGROUP_NET_PRIO=y CONFIG_BPF_JIT=y CONFIG_CAN=y +CONFIG_CAN_LSCANFD=y +CONFIG_CAN_LSCANFD_PLATFORM=y CONFIG_CFG80211=y CONFIG_MAC80211=y CONFIG_RFKILL=y diff --git a/drivers/net/can/Kconfig b/drivers/net/can/Kconfig index 424970939..c2b20cadc 100644 --- a/drivers/net/can/Kconfig +++ b/drivers/net/can/Kconfig @@ -177,6 +177,7 @@ source "drivers/net/can/sja1000/Kconfig" source "drivers/net/can/softing/Kconfig" source "drivers/net/can/spi/Kconfig" source "drivers/net/can/usb/Kconfig" +source "drivers/net/can/ls_canfd/Kconfig" endif diff --git a/drivers/net/can/Makefile b/drivers/net/can/Makefile index 221643001..06150fb43 100644 --- a/drivers/net/can/Makefile +++ b/drivers/net/can/Makefile @@ -34,5 +34,6 @@ obj-$(CONFIG_CAN_SUN4I) += sun4i_can.o obj-$(CONFIG_CAN_TI_HECC) += ti_hecc.o obj-$(CONFIG_CAN_XILINXCAN) += xilinx_can.o obj-$(CONFIG_PCH_CAN) += pch_can.o +obj-$(CONFIG_CAN_LSCANFD) += ls_canfd/ subdir-ccflags-$(CONFIG_CAN_DEBUG_DEVICES) += -DDEBUG diff --git a/drivers/net/can/ls_canfd/Kconfig b/drivers/net/can/ls_canfd/Kconfig new file mode 100644 index 000000000..7ddfd5292 --- /dev/null +++ b/drivers/net/can/ls_canfd/Kconfig @@ -0,0 +1,18 @@ +menuconfig CAN_LSCANFD + tristate "Support LSCAN devices" + depends on HAS_IOMEM + +if CAN_LSCANFD + +config CAN_LSCANFD_PLATFORM + tristate "Generic Platform Bus based LSCAN driver" + help + This driver adds support for the 2K chips connected to + the "platform bus" (Linux abstraction for directly to the + processor attached devices). Which can be found on various + boards from Phytec (http://www.phytec.de) like the PCM027, + PCM038. It also provides the OpenFirmware "platform bus" found + on embedded systems with OpenFirmware bindings, e.g. if you + have a PowerPC based system you may want to enable this option. +endif + diff --git a/drivers/net/can/ls_canfd/Makefile b/drivers/net/can/ls_canfd/Makefile new file mode 100644 index 000000000..c822ba53e --- /dev/null +++ b/drivers/net/can/ls_canfd/Makefile @@ -0,0 +1,13 @@ +# LS CAN FD ip core Linux driver Makefile + +# Invoked make without parameters for native build for current running kernel +# Set KERNEL_VERSION variable to compile for specific installed kernel version +# Exact location of Linux kernel build tree can be chosen by KDIR variable +# If you build for different CPU architecture than native and you do not +# use GNUmakefile trick to set CROSS_COMPILE and ARCH then set these to +# matching values else you do not screw only LS CAN FD build but even +# base kernel build + +obj-$(CONFIG_CAN_LSCANFD) := lscanfd.o +lscanfd-y := lscanfd_dma.elfbin +obj-$(CONFIG_CAN_LSCANFD_PLATFORM) += lscanfd_platform.elfbin diff --git a/drivers/net/can/ls_canfd/lscanfd_dma.elfbin b/drivers/net/can/ls_canfd/lscanfd_dma.elfbin new file mode 100644 index 0000000000000000000000000000000000000000..5030c9691d1e0cb9217d1b27d1ccd68dea3ed576 GIT binary patch literal 97864 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 Y8}*Inr^v>5$8WOy-KGZJLQlj03+*lkHUIzs literal 0 HcmV?d00001 diff --git a/drivers/net/can/ls_canfd/lscanfd_platform.elfbin b/drivers/net/can/ls_canfd/lscanfd_platform.elfbin new file mode 100644 index 0000000000000000000000000000000000000000..43a227acc0064a1120db32e0260d121f8970f3bb GIT binary patch literal 14336 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 m^cr>jcI~m #include "es8328.h" -#ifdef CONFIG_LOONGARCH -static struct reg_default es8328_reg_defaults[] = { - {ES8328_ADCPOWER, 0x00}, - {ES8328_DACPOWER, - BIT(ES8328_DACPOWER_ROUT2_ON) | - BIT(ES8328_DACPOWER_LOUT2_ON) | - BIT(ES8328_DACPOWER_ROUT1_ON) | - BIT(ES8328_DACPOWER_LOUT1_ON)}, - //{ES8328_DACCONTROL2, 0x03}, - // - {ES8328_LDACVOL, 0x00}, - {ES8328_RDACVOL, 0x00}, - // - //{ES8328_DACCONTROL17, 0xb8}, - //{ES8328_DACCONTROL20, 0xb8}, - {ES8328_DACCONTROL17, ES8328_DACCONTROL17_LD2LO}, - {ES8328_DACCONTROL20, ES8328_DACCONTROL20_RD2RO}, - {ES8328_LOUT1VOL , 0x21}, - {ES8328_ROUT1VOL , 0x21}, -}; - -static void es8328_use_default_regs(struct snd_soc_component *component) -{ - int i = 0; - for (i = 0; i < ARRAY_SIZE(es8328_reg_defaults); i++) { - snd_soc_component_write(component, es8328_reg_defaults[i].reg, - es8328_reg_defaults[i].def); - } -} -#endif static const unsigned int rates_12288[] = { 8000, 12000, 16000, 24000, 32000, 48000, 96000, }; @@ -96,6 +66,11 @@ static const char * const supply_names[ES8328_SUPPLY_NUM] = { "HPVDD", }; +#ifdef CONFIG_LOONGARCH +// MASTER MODE Temperary Fix +#define ES8328_RATES (SNDRV_PCM_RATE_8000) +#define ES8328_FORMATS (SNDRV_PCM_FMTBIT_S16_LE) +#else #define ES8328_RATES (SNDRV_PCM_RATE_192000 | \ SNDRV_PCM_RATE_96000 | \ SNDRV_PCM_RATE_88200 | \ @@ -105,6 +80,7 @@ static const char * const supply_names[ES8328_SUPPLY_NUM] = { SNDRV_PCM_FMTBIT_S20_3LE | \ SNDRV_PCM_FMTBIT_S24_LE | \ SNDRV_PCM_FMTBIT_S32_LE) +#endif struct es8328_priv { struct regmap *regmap; @@ -197,7 +173,7 @@ static int es8328_put_deemph(struct snd_kcontrol *kcontrol, es8328->deemph = deemph; - return 0; + return 1; } @@ -574,7 +550,10 @@ static int es8328_hw_params(struct snd_pcm_substream *substream, snd_soc_component_update_bits(component, ES8328_ADCCONTROL4, ES8328_ADCCONTROL4_ADCWL_MASK, wl << ES8328_ADCCONTROL4_ADCWL_SHIFT); - +#ifdef CONFIG_LOONGARCH + // alsamixer 中暂时没找到调整该配置选项,临时处理 + snd_soc_component_write(component, ES8328_ADCPOWER, 0x00); +#endif return snd_soc_component_update_bits(component, reg, ES8328_RATEMASK, ratio); } @@ -825,7 +804,15 @@ static int es8328_component_probe(struct snd_soc_component *component) goto clk_fail; } #ifdef CONFIG_LOONGARCH - es8328_use_default_regs(component); + es8328->sysclk_constraints = &constraints_12288; + es8328->mclk_ratios = ratios_12288; + + // RESET CODEC + snd_soc_component_write(component, ES8328_CHIPPOWER, + ES8328_CHIPPOWER_ADCDIG_OFF | + ES8328_CHIPPOWER_DACDIG_OFF | + ES8328_CHIPPOWER_ADCSTM_RESET | + ES8328_CHIPPOWER_DACSTM_RESET); #endif return 0; diff --git a/sound/soc/loongson/ls-i2s.c b/sound/soc/loongson/ls-i2s.c index d5f78bed3..9b88b6c8b 100644 --- a/sound/soc/loongson/ls-i2s.c +++ b/sound/soc/loongson/ls-i2s.c @@ -31,7 +31,8 @@ #define PSC_I2S_RATES SNDRV_PCM_RATE_8000_96000 -#define PSC_I2S_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \ +#define PSC_I2S_FORMATS ( SNDRV_PCM_FMTBIT_S8 | \ + SNDRV_PCM_FMTBIT_S16_LE | \ SNDRV_PCM_FMTBIT_S20_3LE | \ SNDRV_PCM_FMTBIT_S24_LE | \ SNDRV_PCM_FMTBIT_S32_LE) diff --git a/sound/soc/loongson/ls-sound-es8388.c b/sound/soc/loongson/ls-sound-es8388.c index c7fa4ba2d..257c939a1 100644 --- a/sound/soc/loongson/ls-sound-es8388.c +++ b/sound/soc/loongson/ls-sound-es8388.c @@ -21,12 +21,9 @@ enum { PRI_PLAYBACK = 0, PRI_CAPTURE, }; -/* - *SND_SOC_DAIFMT_CBS_CFS play ok, volume ok - *SND_SOC_DAIFMT_CBM_CFM Codec's BCLK is Master,LRCLK is Master - */ #define LOONGSON_DAI_FMT (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | \ - SND_SOC_DAIFMT_CBS_CFS) + SND_SOC_DAIFMT_CBM_CFM) +// SND_SOC_DAIFMT_CBS_CFS) SND_SOC_DAILINK_DEFS(es8388_hifi, DAILINK_COMP_ARRAY(COMP_CPU("loongson-i2s-dai")),