From c5cfe4d2da2785d24d84bbe84721180de439080a Mon Sep 17 00:00:00 2001 From: maoxiaochuan Date: Wed, 18 Dec 2024 16:46:16 +0800 Subject: [PATCH] update to 74bf105eb 2K1000:usb-sound:ADD ALL USB-SOUND DRIVER FOR CUSTOMER USE 2k300:uart:Fix error rx status which is unexpected and error ECHO char 2K300-GONGKONG:Add RTC-DS1307 Driver, Fix Expand-GPIO IRQ not correct bug 2K300:EMMC mark "non-removable", Fix system cannot reboot in some case 2K300:Fix Pause/Resume cannot work BUG when play sound by gst or aplay 2K300:Add can tranceiver standing by gpio control 2K300:Fix OTG Cannot Recognise device problem --- .../boot/dts/loongson/loongson2k300.dtsi | 1 + .../dts/loongson/ls2k300_gongkong_gbkpgk0.dts | 20 +++++++---- .../configs/loongson_2k1000_defconfig | 11 +++++- .../configs/loongson_2k300_defconfig | 1 + drivers/mmc/host/ls2kmci.c | 7 ++++ .../net/can/ls_canfd/lscanfd_dma.o_shipped | Bin 98120 -> 99552 bytes drivers/tty/serial/8250/8250_port.c | 25 ++++++++++++-- drivers/usb/core/generic.c | 10 ++++-- drivers/usb/core/hub.c | 11 ++++-- drivers/usb/dwc2/hcd.c | 1 + sound/soc/loongson/ls-i2s.c | 32 +++++++++++++++++- sound/soc/loongson/ls-pcm-generic.c | 24 ++----------- 12 files changed, 107 insertions(+), 36 deletions(-) diff --git a/arch/loongarch/boot/dts/loongson/loongson2k300.dtsi b/arch/loongarch/boot/dts/loongson/loongson2k300.dtsi index e2442719c..1b45d1812 100644 --- a/arch/loongarch/boot/dts/loongson/loongson2k300.dtsi +++ b/arch/loongarch/boot/dts/loongson/loongson2k300.dtsi @@ -707,6 +707,7 @@ cap-mmc-highspeed; no-sd; no-sdio; + non-removable; }; sdio1: sdio@0x16148000 { diff --git a/arch/loongarch/boot/dts/loongson/ls2k300_gongkong_gbkpgk0.dts b/arch/loongarch/boot/dts/loongson/ls2k300_gongkong_gbkpgk0.dts index 4c5bc528f..378291812 100644 --- a/arch/loongarch/boot/dts/loongson/ls2k300_gongkong_gbkpgk0.dts +++ b/arch/loongarch/boot/dts/loongson/ls2k300_gongkong_gbkpgk0.dts @@ -1,5 +1,6 @@ #include "ls2k300_g2k03z2_core.dtsi" #include +#include "loongson_panel_param.dtsi" / { model = "LS2K300-GONGKONG-GBKPGK0"; @@ -48,7 +49,7 @@ /* lcd power on control gpio */ // enable-gpios = <&pioA 3 GPIO_ACTIVE_HIGH>; // power-supply = <&vdd_lcd>; -#if 1 // 4.3' LCD +#if 0 // 4.3' LCD width-mm = <223>; height-mm = <125>; label = "ATK-MD0430R-800x480"; @@ -173,7 +174,7 @@ }; &i2c2 { - i2c-speed = <400000>; + //i2c-speed = <400000>; codec: es8388@11{ compatible = "everest,es8388"; @@ -217,6 +218,11 @@ interrupt-controller; #interrupt-cells = <2>; }; + + rtc_ds1307@68 { + compatible = "dallas,ds1307"; + reg = <0x68>; + }; }; &i2c3 { @@ -237,9 +243,9 @@ gpio-controller; #gpio-cells = <2>; // 2K300 GPIO 支持中断控制 - // GPIO 中断号为 vhwirq-base + pinnum (194 = 128 + 66) + // GPIO 中断号为 vhwirq-base + pinnum (195 = 128 + 67) interrupt-parent = <&gpio>; - interrupts = <194 IRQ_TYPE_EDGE_FALLING>; + interrupts = <195 IRQ_TYPE_EDGE_FALLING>; interrupt-controller; #interrupt-cells = <2>; }; @@ -250,9 +256,9 @@ gpio-controller; #gpio-cells = <2>; // 2K300 GPIO 支持中断控制 - // GPIO 中断号为 vhwirq-base + pinnum (195 = 128 + 67) + // GPIO 中断号为 vhwirq-base + pinnum (194 = 128 + 66) interrupt-parent = <&gpio>; - interrupts = <195 IRQ_TYPE_EDGE_FALLING>; + interrupts = <194 IRQ_TYPE_EDGE_FALLING>; interrupt-controller; #interrupt-cells = <2>; }; @@ -301,10 +307,12 @@ &can2 { status = "ok"; + ls,canfd-stb-gpio = <&gpio 60 GPIO_ACTIVE_HIGH>; }; &can3 { status = "ok"; + ls,canfd-stb-gpio = <&gpio 60 GPIO_ACTIVE_HIGH>; }; &adc { diff --git a/arch/loongarch/configs/loongson_2k1000_defconfig b/arch/loongarch/configs/loongson_2k1000_defconfig index 6b68c6521..b6387fdd9 100644 --- a/arch/loongarch/configs/loongson_2k1000_defconfig +++ b/arch/loongarch/configs/loongson_2k1000_defconfig @@ -459,9 +459,18 @@ CONFIG_SND_HDA_CODEC_SIGMATEL=y CONFIG_SND_HDA_CODEC_HDMI=y CONFIG_SND_HDA_CODEC_CONEXANT=y CONFIG_SND_USB_AUDIO=y +CONFIG_SND_USB_UA101=y +CONFIG_SND_USB_CAIAQ=y +CONFIG_SND_USB_CAIAQ_INPUT=y +CONFIG_SND_USB_6FIRE=y +CONFIG_SND_USB_HIFACE=y +CONFIG_SND_BCD2000=y +CONFIG_SND_USB_POD=y +CONFIG_SND_USB_PODHD=y +CONFIG_SND_USB_TONEPORT=y +CONFIG_SND_USB_VARIAX=y CONFIG_SND_SOC=y CONFIG_SND_SOC_LOONGSON=y -CONFIG_SND_SOC_LOONGSON_CJC8988=y CONFIG_SND_LS=y CONFIG_SND_LS_PCM=y CONFIG_HIDRAW=y diff --git a/arch/loongarch/configs/loongson_2k300_defconfig b/arch/loongarch/configs/loongson_2k300_defconfig index 9cecae541..f7b76177f 100644 --- a/arch/loongarch/configs/loongson_2k300_defconfig +++ b/arch/loongarch/configs/loongson_2k300_defconfig @@ -563,6 +563,7 @@ CONFIG_LEDS_GPIO=y CONFIG_LEDS_PWM=y CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_DS1307=y CONFIG_RTC_DRV_RX8025T=y CONFIG_RTC_DRV_SD3078=y CONFIG_RTC_DRV_LS2X=y diff --git a/drivers/mmc/host/ls2kmci.c b/drivers/mmc/host/ls2kmci.c index 3937233f1..42e62686b 100644 --- a/drivers/mmc/host/ls2kmci.c +++ b/drivers/mmc/host/ls2kmci.c @@ -1101,6 +1101,10 @@ probe_free_host: static void ls2k_mci_shutdown(struct platform_device *pdev) { struct mmc_host *mmc = platform_get_drvdata(pdev); + struct ls2k_mci_host *host = mmc_priv(mmc); + + if (mmc->caps & MMC_CAP_NONREMOVABLE) + return; mmc_remove_host(mmc); } @@ -1110,6 +1114,9 @@ static int ls2k_mci_remove(struct platform_device *pdev) struct mmc_host *mmc = platform_get_drvdata(pdev); struct ls2k_mci_host *host = mmc_priv(mmc); + if (mmc->caps & MMC_CAP_NONREMOVABLE) + return 0; + ls2k_mci_shutdown(pdev); diff --git a/drivers/net/can/ls_canfd/lscanfd_dma.o_shipped b/drivers/net/can/ls_canfd/lscanfd_dma.o_shipped index b08a62d8527ecfa7e93763e0c90ddeda2e775995..f17237627198e46af1d78727e079807ffc227c1a 100644 GIT binary patch delta 6920 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 O1^Lfsml$p)dma->rx_dma(up); } +static int serial8250_handle_irq_rx_status_error_ignore(unsigned char status) +{ + unsigned char temp; + int i = 0; + + // 0x18 打断中断 有帧错误表示位 接收FIFO为空 + unsigned char error_value_set[] = {(UART_LSR_BI | UART_LSR_FE), UART_LSR_BI}; + unsigned char error_mask_set[] = {(UART_LSR_BI | UART_LSR_FE | UART_LSR_DR), (UART_LSR_BI | UART_LSR_DR)}; + + for (i = 0; i < sizeof(error_value_set); ++i) { + temp = status; + temp &= error_mask_set[i]; + if (temp == error_value_set[i]) { + return 0; + } + } + return -1; +} + /* * This handles the interrupt from one port. */ @@ -1910,8 +1929,10 @@ int serial8250_handle_irq(struct uart_port *port, unsigned int iir) skip_rx = true; if (status & (UART_LSR_DR | UART_LSR_BI) && !skip_rx) { - if (!up->dma || handle_rx_dma(up, iir)) - status = serial8250_rx_chars(up, status); + if (serial8250_handle_irq_rx_status_error_ignore(status)) { + if (!up->dma || handle_rx_dma(up, iir)) + status = serial8250_rx_chars(up, status); + } } serial8250_modem_status(up); if ((!up->dma || up->dma->tx_err) && (status & UART_LSR_THRE) && diff --git a/drivers/usb/core/generic.c b/drivers/usb/core/generic.c index 26f9fb9f6..7c8c24808 100644 --- a/drivers/usb/core/generic.c +++ b/drivers/usb/core/generic.c @@ -225,7 +225,7 @@ static bool usb_generic_driver_match(struct usb_device *udev) int usb_generic_driver_probe(struct usb_device *udev) { - int err, c; + int err, c, try; /* Choose and set the configuration. This registers the interfaces * with the driver core and lets interface drivers bind to them. @@ -235,7 +235,13 @@ int usb_generic_driver_probe(struct usb_device *udev) else { c = usb_choose_configuration(udev); if (c >= 0) { - err = usb_set_configuration(udev, c); + for (try = 0; try < 5; try++) { + err = usb_set_configuration(udev, c); + if (!err) + break; + dev_warn(&udev->dev, "try to set config #%d again\n", c); + udelay(100); + } if (err && err != -ENODEV) { dev_err(&udev->dev, "can't set config #%d, error %d\n", c, err); diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 17202b2ee..94b5ef758 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -2874,7 +2874,7 @@ static int hub_port_wait_reset(struct usb_hub *hub, int port1, static int hub_port_reset(struct usb_hub *hub, int port1, struct usb_device *udev, unsigned int delay, bool warm) { - int i, status; + int i, status, rst_try; u16 portchange, portstatus; struct usb_port *port_dev = hub->ports[port1 - 1]; int reset_recovery_time; @@ -2903,6 +2903,7 @@ static int hub_port_reset(struct usb_hub *hub, int port1, /* Reset the port */ for (i = 0; i < PORT_RESET_TRIES; i++) { +try_rst_again: status = set_port_feature(hub->hdev, port1, (warm ? USB_PORT_FEAT_BH_PORT_RESET : USB_PORT_FEAT_RESET)); @@ -2915,10 +2916,16 @@ static int hub_port_reset(struct usb_hub *hub, int port1, } else { status = hub_port_wait_reset(hub, port1, udev, delay, warm); - if (status && status != -ENOTCONN && status != -ENODEV) + if (status && status != -ENOTCONN && status != -ENODEV) { + if (rst_try < 5) { + rst_try++; + udelay(10); + goto try_rst_again; + } dev_dbg(hub->intfdev, "port_wait_reset: err = %d\n", status); + } } /* Check for disconnect or reset */ diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c index e9ac215b9..1b749a535 100644 --- a/drivers/usb/dwc2/hcd.c +++ b/drivers/usb/dwc2/hcd.c @@ -3682,6 +3682,7 @@ static int dwc2_hcd_hub_control(struct dwc2_hsotg *hsotg, u16 typereq, hprt0 &= ~HPRT0_RST; dwc2_writel(hsotg, hprt0, HPRT0); hsotg->lx_state = DWC2_L0; /* Now back to On state */ + msleep(50); break; case USB_PORT_FEAT_INDICATOR: diff --git a/sound/soc/loongson/ls-i2s.c b/sound/soc/loongson/ls-i2s.c index 35897055c..118905f00 100644 --- a/sound/soc/loongson/ls-i2s.c +++ b/sound/soc/loongson/ls-i2s.c @@ -24,6 +24,7 @@ #include #include "ls-i2s.h" +#include "ls-pcm.h" #define PCM_STEREO_OUT_NAME "I2S PCM Stereo out" #define PCM_STEREO_IN_NAME "I2S PCM Stereo in" @@ -136,16 +137,45 @@ static int ls_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int format) static int ls_i2s_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { + struct ls_runtime_data *prtd = substream->runtime->private_data; + uint32_t data; int ret = 0; switch (cmd) { case SNDRV_PCM_TRIGGER_START: - break; case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { + data = readl((void*)prtd->i2s_ctl_base); + data &= ~(0x1 << 12); + writel(data, (void*)prtd->i2s_ctl_base); + data = readl((void*)prtd->i2s_ctl_base); + if (ls_i2s_is_slave_mode()) + data |= 0x4010 | (1 << 7) | (1 << 12); + else + data |= 0xc010 | (1 << 7) | (1 << 12); + writel(data, (void*)prtd->i2s_ctl_base); + } else { + data = readl((void*)prtd->i2s_ctl_base); + if (ls_i2s_is_slave_mode()) + data |= 0x4010 | (1 << 11) | (1 << 13); + else + data |= 0xc010 | (1 << 11) | (1 << 13); + writel(data, (void*)prtd->i2s_ctl_base); + } + break; case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_PAUSE_PUSH: + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { + data = readl((void*)prtd->i2s_ctl_base); + data &= ~((1 << 7) | (1 << 12)); + writel(data, (void*)prtd->i2s_ctl_base); + } else { + data = readl((void*)prtd->i2s_ctl_base); + data &= ~((1 << 13) | (1 << 11)); + writel(data, (void*)prtd->i2s_ctl_base); + } break; default: ret = -EINVAL; diff --git a/sound/soc/loongson/ls-pcm-generic.c b/sound/soc/loongson/ls-pcm-generic.c index a961d9407..ecf2bbdaa 100644 --- a/sound/soc/loongson/ls-pcm-generic.c +++ b/sound/soc/loongson/ls-pcm-generic.c @@ -128,37 +128,17 @@ static int ls_pcm_trigger(struct snd_soc_component *component, case SNDRV_PCM_TRIGGER_START: dma_async_issue_pending(chan); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - data = readl((void*)prtd->i2s_ctl_base); - data &= ~(0x1 << 12); - writel(data, (void*)prtd->i2s_ctl_base); - data = readl((void*)prtd->i2s_ctl_base); - if (ls_i2s_is_slave_mode()) - data |= 0x4010 | (1 << 7) | (1 << 12); - else - data |= 0xc010 | (1 << 7) | (1 << 12); - writel(data, (void*)prtd->i2s_ctl_base); - } else { - data = readl((void*)prtd->i2s_ctl_base); - if (ls_i2s_is_slave_mode()) - data |= 0x4010 | (1 << 11) | (1 << 13); - else - data |= 0xc010 | (1 << 11) | (1 << 13); - writel(data, (void*)prtd->i2s_ctl_base); - } break; case SNDRV_PCM_TRIGGER_STOP: dmaengine_terminate_all(chan); break; case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - dmaengine_terminate_all(chan); + dmaengine_pause(chan); break; case SNDRV_PCM_TRIGGER_RESUME: - break; case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - dma_async_issue_pending(chan); - udelay(1000); + dmaengine_resume(chan); break; default: ret = -EINVAL;