mirror of
https://gitee.com/open-loongarch/linux-5.10.git
synced 2026-10-25 12:47:11 +08:00
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
This commit is contained in:
@@ -707,6 +707,7 @@
|
|||||||
cap-mmc-highspeed;
|
cap-mmc-highspeed;
|
||||||
no-sd;
|
no-sd;
|
||||||
no-sdio;
|
no-sdio;
|
||||||
|
non-removable;
|
||||||
};
|
};
|
||||||
|
|
||||||
sdio1: sdio@0x16148000 {
|
sdio1: sdio@0x16148000 {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#include "ls2k300_g2k03z2_core.dtsi"
|
#include "ls2k300_g2k03z2_core.dtsi"
|
||||||
#include <dt-bindings/interrupt-controller/irq.h>
|
#include <dt-bindings/interrupt-controller/irq.h>
|
||||||
|
#include "loongson_panel_param.dtsi"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "LS2K300-GONGKONG-GBKPGK0";
|
model = "LS2K300-GONGKONG-GBKPGK0";
|
||||||
@@ -48,7 +49,7 @@
|
|||||||
/* lcd power on control gpio */
|
/* lcd power on control gpio */
|
||||||
// enable-gpios = <&pioA 3 GPIO_ACTIVE_HIGH>;
|
// enable-gpios = <&pioA 3 GPIO_ACTIVE_HIGH>;
|
||||||
// power-supply = <&vdd_lcd>;
|
// power-supply = <&vdd_lcd>;
|
||||||
#if 1 // 4.3' LCD
|
#if 0 // 4.3' LCD
|
||||||
width-mm = <223>;
|
width-mm = <223>;
|
||||||
height-mm = <125>;
|
height-mm = <125>;
|
||||||
label = "ATK-MD0430R-800x480";
|
label = "ATK-MD0430R-800x480";
|
||||||
@@ -173,7 +174,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
&i2c2 {
|
&i2c2 {
|
||||||
i2c-speed = <400000>;
|
//i2c-speed = <400000>;
|
||||||
|
|
||||||
codec: es8388@11{
|
codec: es8388@11{
|
||||||
compatible = "everest,es8388";
|
compatible = "everest,es8388";
|
||||||
@@ -217,6 +218,11 @@
|
|||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <2>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
rtc_ds1307@68 {
|
||||||
|
compatible = "dallas,ds1307";
|
||||||
|
reg = <0x68>;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
&i2c3 {
|
&i2c3 {
|
||||||
@@ -237,9 +243,9 @@
|
|||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
// 2K300 GPIO 支持中断控制
|
// 2K300 GPIO 支持中断控制
|
||||||
// GPIO 中断号为 vhwirq-base + pinnum (194 = 128 + 66)
|
// GPIO 中断号为 vhwirq-base + pinnum (195 = 128 + 67)
|
||||||
interrupt-parent = <&gpio>;
|
interrupt-parent = <&gpio>;
|
||||||
interrupts = <194 IRQ_TYPE_EDGE_FALLING>;
|
interrupts = <195 IRQ_TYPE_EDGE_FALLING>;
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <2>;
|
||||||
};
|
};
|
||||||
@@ -250,9 +256,9 @@
|
|||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
// 2K300 GPIO 支持中断控制
|
// 2K300 GPIO 支持中断控制
|
||||||
// GPIO 中断号为 vhwirq-base + pinnum (195 = 128 + 67)
|
// GPIO 中断号为 vhwirq-base + pinnum (194 = 128 + 66)
|
||||||
interrupt-parent = <&gpio>;
|
interrupt-parent = <&gpio>;
|
||||||
interrupts = <195 IRQ_TYPE_EDGE_FALLING>;
|
interrupts = <194 IRQ_TYPE_EDGE_FALLING>;
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <2>;
|
||||||
};
|
};
|
||||||
@@ -301,10 +307,12 @@
|
|||||||
|
|
||||||
&can2 {
|
&can2 {
|
||||||
status = "ok"
|
status = "ok"
|
||||||
|
ls,canfd-stb-gpio = <&gpio 60 GPIO_ACTIVE_HIGH>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&can3 {
|
&can3 {
|
||||||
status = "ok"
|
status = "ok"
|
||||||
|
ls,canfd-stb-gpio = <&gpio 60 GPIO_ACTIVE_HIGH>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&adc {
|
&adc {
|
||||||
|
|||||||
@@ -459,9 +459,18 @@ CONFIG_SND_HDA_CODEC_SIGMATEL=y
|
|||||||
CONFIG_SND_HDA_CODEC_HDMI=y
|
CONFIG_SND_HDA_CODEC_HDMI=y
|
||||||
CONFIG_SND_HDA_CODEC_CONEXANT=y
|
CONFIG_SND_HDA_CODEC_CONEXANT=y
|
||||||
CONFIG_SND_USB_AUDIO=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=y
|
||||||
CONFIG_SND_SOC_LOONGSON=y
|
CONFIG_SND_SOC_LOONGSON=y
|
||||||
CONFIG_SND_SOC_LOONGSON_CJC8988=y
|
|
||||||
CONFIG_SND_LS=y
|
CONFIG_SND_LS=y
|
||||||
CONFIG_SND_LS_PCM=y
|
CONFIG_SND_LS_PCM=y
|
||||||
CONFIG_HIDRAW=y
|
CONFIG_HIDRAW=y
|
||||||
|
|||||||
@@ -563,6 +563,7 @@ CONFIG_LEDS_GPIO=y
|
|||||||
CONFIG_LEDS_PWM=y
|
CONFIG_LEDS_PWM=y
|
||||||
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
|
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
|
||||||
CONFIG_RTC_CLASS=y
|
CONFIG_RTC_CLASS=y
|
||||||
|
CONFIG_RTC_DRV_DS1307=y
|
||||||
CONFIG_RTC_DRV_RX8025T=y
|
CONFIG_RTC_DRV_RX8025T=y
|
||||||
CONFIG_RTC_DRV_SD3078=y
|
CONFIG_RTC_DRV_SD3078=y
|
||||||
CONFIG_RTC_DRV_LS2X=y
|
CONFIG_RTC_DRV_LS2X=y
|
||||||
|
|||||||
@@ -1101,6 +1101,10 @@ probe_free_host:
|
|||||||
static void ls2k_mci_shutdown(struct platform_device *pdev)
|
static void ls2k_mci_shutdown(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct mmc_host *mmc = platform_get_drvdata(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);
|
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 mmc_host *mmc = platform_get_drvdata(pdev);
|
||||||
struct ls2k_mci_host *host = mmc_priv(mmc);
|
struct ls2k_mci_host *host = mmc_priv(mmc);
|
||||||
|
|
||||||
|
if (mmc->caps & MMC_CAP_NONREMOVABLE)
|
||||||
|
return 0;
|
||||||
|
|
||||||
ls2k_mci_shutdown(pdev);
|
ls2k_mci_shutdown(pdev);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -1879,6 +1879,25 @@ static bool handle_rx_dma(struct uart_8250_port *up, unsigned int iir)
|
|||||||
return up->dma->rx_dma(up);
|
return up->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.
|
* This handles the interrupt from one port.
|
||||||
*/
|
*/
|
||||||
@@ -1910,9 +1929,11 @@ int serial8250_handle_irq(struct uart_port *port, unsigned int iir)
|
|||||||
skip_rx = true;
|
skip_rx = true;
|
||||||
|
|
||||||
if (status & (UART_LSR_DR | UART_LSR_BI) && !skip_rx) {
|
if (status & (UART_LSR_DR | UART_LSR_BI) && !skip_rx) {
|
||||||
|
if (serial8250_handle_irq_rx_status_error_ignore(status)) {
|
||||||
if (!up->dma || handle_rx_dma(up, iir))
|
if (!up->dma || handle_rx_dma(up, iir))
|
||||||
status = serial8250_rx_chars(up, status);
|
status = serial8250_rx_chars(up, status);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
serial8250_modem_status(up);
|
serial8250_modem_status(up);
|
||||||
if ((!up->dma || up->dma->tx_err) && (status & UART_LSR_THRE) &&
|
if ((!up->dma || up->dma->tx_err) && (status & UART_LSR_THRE) &&
|
||||||
(up->ier & UART_IER_THRI))
|
(up->ier & UART_IER_THRI))
|
||||||
|
|||||||
@@ -225,7 +225,7 @@ static bool usb_generic_driver_match(struct usb_device *udev)
|
|||||||
|
|
||||||
int usb_generic_driver_probe(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
|
/* Choose and set the configuration. This registers the interfaces
|
||||||
* with the driver core and lets interface drivers bind to them.
|
* 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 {
|
else {
|
||||||
c = usb_choose_configuration(udev);
|
c = usb_choose_configuration(udev);
|
||||||
if (c >= 0) {
|
if (c >= 0) {
|
||||||
|
for (try = 0; try < 5; try++) {
|
||||||
err = usb_set_configuration(udev, c);
|
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) {
|
if (err && err != -ENODEV) {
|
||||||
dev_err(&udev->dev, "can't set config #%d, error %d\n",
|
dev_err(&udev->dev, "can't set config #%d, error %d\n",
|
||||||
c, err);
|
c, err);
|
||||||
|
|||||||
@@ -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,
|
static int hub_port_reset(struct usb_hub *hub, int port1,
|
||||||
struct usb_device *udev, unsigned int delay, bool warm)
|
struct usb_device *udev, unsigned int delay, bool warm)
|
||||||
{
|
{
|
||||||
int i, status;
|
int i, status, rst_try;
|
||||||
u16 portchange, portstatus;
|
u16 portchange, portstatus;
|
||||||
struct usb_port *port_dev = hub->ports[port1 - 1];
|
struct usb_port *port_dev = hub->ports[port1 - 1];
|
||||||
int reset_recovery_time;
|
int reset_recovery_time;
|
||||||
@@ -2903,6 +2903,7 @@ static int hub_port_reset(struct usb_hub *hub, int port1,
|
|||||||
|
|
||||||
/* Reset the port */
|
/* Reset the port */
|
||||||
for (i = 0; i < PORT_RESET_TRIES; i++) {
|
for (i = 0; i < PORT_RESET_TRIES; i++) {
|
||||||
|
try_rst_again:
|
||||||
status = set_port_feature(hub->hdev, port1, (warm ?
|
status = set_port_feature(hub->hdev, port1, (warm ?
|
||||||
USB_PORT_FEAT_BH_PORT_RESET :
|
USB_PORT_FEAT_BH_PORT_RESET :
|
||||||
USB_PORT_FEAT_RESET));
|
USB_PORT_FEAT_RESET));
|
||||||
@@ -2915,11 +2916,17 @@ static int hub_port_reset(struct usb_hub *hub, int port1,
|
|||||||
} else {
|
} else {
|
||||||
status = hub_port_wait_reset(hub, port1, udev, delay,
|
status = hub_port_wait_reset(hub, port1, udev, delay,
|
||||||
warm);
|
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,
|
dev_dbg(hub->intfdev,
|
||||||
"port_wait_reset: err = %d\n",
|
"port_wait_reset: err = %d\n",
|
||||||
status);
|
status);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Check for disconnect or reset */
|
/* Check for disconnect or reset */
|
||||||
if (status == 0 || status == -ENOTCONN || status == -ENODEV) {
|
if (status == 0 || status == -ENOTCONN || status == -ENODEV) {
|
||||||
|
|||||||
@@ -3682,6 +3682,7 @@ static int dwc2_hcd_hub_control(struct dwc2_hsotg *hsotg, u16 typereq,
|
|||||||
hprt0 &= ~HPRT0_RST;
|
hprt0 &= ~HPRT0_RST;
|
||||||
dwc2_writel(hsotg, hprt0, HPRT0);
|
dwc2_writel(hsotg, hprt0, HPRT0);
|
||||||
hsotg->lx_state = DWC2_L0; /* Now back to On state */
|
hsotg->lx_state = DWC2_L0; /* Now back to On state */
|
||||||
|
msleep(50);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case USB_PORT_FEAT_INDICATOR:
|
case USB_PORT_FEAT_INDICATOR:
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
#include <linux/acpi.h>
|
#include <linux/acpi.h>
|
||||||
|
|
||||||
#include "ls-i2s.h"
|
#include "ls-i2s.h"
|
||||||
|
#include "ls-pcm.h"
|
||||||
|
|
||||||
#define PCM_STEREO_OUT_NAME "I2S PCM Stereo out"
|
#define PCM_STEREO_OUT_NAME "I2S PCM Stereo out"
|
||||||
#define PCM_STEREO_IN_NAME "I2S PCM Stereo in"
|
#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,
|
static int ls_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
|
||||||
struct snd_soc_dai *dai)
|
struct snd_soc_dai *dai)
|
||||||
{
|
{
|
||||||
|
struct ls_runtime_data *prtd = substream->runtime->private_data;
|
||||||
|
uint32_t data;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case SNDRV_PCM_TRIGGER_START:
|
case SNDRV_PCM_TRIGGER_START:
|
||||||
break;
|
|
||||||
case SNDRV_PCM_TRIGGER_RESUME:
|
case SNDRV_PCM_TRIGGER_RESUME:
|
||||||
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
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_STOP:
|
||||||
case SNDRV_PCM_TRIGGER_SUSPEND:
|
case SNDRV_PCM_TRIGGER_SUSPEND:
|
||||||
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
|
|||||||
@@ -128,37 +128,17 @@ static int ls_pcm_trigger(struct snd_soc_component *component,
|
|||||||
case SNDRV_PCM_TRIGGER_START:
|
case SNDRV_PCM_TRIGGER_START:
|
||||||
dma_async_issue_pending(chan);
|
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;
|
break;
|
||||||
case SNDRV_PCM_TRIGGER_STOP:
|
case SNDRV_PCM_TRIGGER_STOP:
|
||||||
dmaengine_terminate_all(chan);
|
dmaengine_terminate_all(chan);
|
||||||
break;
|
break;
|
||||||
case SNDRV_PCM_TRIGGER_SUSPEND:
|
case SNDRV_PCM_TRIGGER_SUSPEND:
|
||||||
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
|
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
|
||||||
dmaengine_terminate_all(chan);
|
dmaengine_pause(chan);
|
||||||
break;
|
break;
|
||||||
case SNDRV_PCM_TRIGGER_RESUME:
|
case SNDRV_PCM_TRIGGER_RESUME:
|
||||||
break;
|
|
||||||
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
||||||
dma_async_issue_pending(chan);
|
dmaengine_resume(chan);
|
||||||
udelay(1000);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
|
|||||||
Reference in New Issue
Block a user