mirror of
https://abf.rosa.ru/djam/kernel-5.15.git
synced 2025-02-23 18:42:55 +00:00

Information about config values was taken from: From 804820df7bcb3d53a33ecd074b1eac277e938f24 Mon Sep 17 00:00:00 2001 From: Alexey Sheplyakov <asheplyakov@altlinux.org> Date: Thu, 4 Feb 2021 19:35:14 +0400 Subject: [PATCH] config-aarch64: adjusted for Baikal-M (MBM1.0 board) * DW_APB_TIMER=y, DW_APB_TIMER_OF=y: SoC clocks * SERIAL_8250_DW=y: serial console * I2C_DESIGNWARE_CORE=y, I2C_DESIGNWARE_PLATFORM=y: BMC (board management controller) and RTC (Real Time Clock) are connected via I2C. * GPIO_DWAPB=y: device (PCIe, PHY, etc) reset/configuration * RTC_DRV_PCF2127=y: RTC compiled in so the kernel automatically sets the system time from the hardware clock * TP_BMC=y: amongst other things handles the power button * DRM_BAIKAL_VDU=m, DRM_BAIKAL_HDMI=m: video unit and HDMI transmitter * CMA_SIZE_MBYTES=256: video display unit and GPU use system RAM, hence CMA should reserve enough (contiguous) memory. Note: CMA reserves memory during very early init, hence the size has to be hard-coded into CONFIG * MALI_MIDGARD=m: GPU driver, kernel side of proprietary mali blob. Note: kernel mode code is GPLv2, so it's fine to distribute it. * SENSORS_BT1_PVT=m: hardware temperature/voltage sensors * PCI_BAIKAL=m: PCIe root complex. Compiled as a module since takes ages (60 seconds or so) to probe the hardware. If compiled in substantially increases the boot time, and machine is completely unresponsive during probing PCIe. When built as a module probing executes concurrently with other boot activities (unless booting from a PCIe device) * STMMAC_ETH=m, STMMAC_PLATFORM=m, DWMAC_BAIKAL=m: Ethernet driver
101 lines
3 KiB
Diff
101 lines
3 KiB
Diff
From c0b58206fc41cad2dcf7ae9193d69aafdce89173 Mon Sep 17 00:00:00 2001
|
|
From: Alexey Sheplyakov <asheplyakov@altlinux.org>
|
|
Date: Mon, 29 Mar 2021 12:22:11 +0400
|
|
Subject: [PATCH 624/625] (BROKEN) dwc-i2s: support BE-M1000 SoC
|
|
|
|
* dw_i2s_probe: request all IRQs specified in device tree
|
|
* dw_i2s_startup: set the correct DAI clock frequency
|
|
|
|
Note that the sound frequency is distorted (i.e. playing 440 Hz
|
|
sine wave results in 467 Hz), for more details see
|
|
|
|
https://github.com/edelweiss-tech/kernel/issues/2
|
|
---
|
|
sound/soc/dwc/dwc-i2s.c | 36 ++++++++++++++++++++++++++----------
|
|
sound/soc/dwc/local.h | 1 +
|
|
2 files changed, 27 insertions(+), 10 deletions(-)
|
|
|
|
diff --git a/sound/soc/dwc/dwc-i2s.c b/sound/soc/dwc/dwc-i2s.c
|
|
index fd4160289fac..e1efad33b522 100644
|
|
--- a/sound/soc/dwc/dwc-i2s.c
|
|
+++ b/sound/soc/dwc/dwc-i2s.c
|
|
@@ -100,6 +100,7 @@ static inline void i2s_enable_irqs(struct dw_i2s_dev *dev, u32 stream,
|
|
|
|
static irqreturn_t i2s_irq_handler(int irq, void *dev_id)
|
|
{
|
|
+ unsigned int rxor_count;
|
|
struct dw_i2s_dev *dev = dev_id;
|
|
bool irq_valid = false;
|
|
u32 isr[4];
|
|
@@ -136,9 +137,13 @@ static irqreturn_t i2s_irq_handler(int irq, void *dev_id)
|
|
irq_valid = true;
|
|
}
|
|
|
|
- /* Error Handling: TX */
|
|
+ /* Error Handling: RX */
|
|
if (isr[i] & ISR_RXFO) {
|
|
- dev_err(dev->dev, "RX overrun (ch_id=%d)\n", i);
|
|
+ rxor_count = READ_ONCE(dev->rx_overrun_count);
|
|
+ if (!(rxor_count & 0x3ff))
|
|
+ dev_dbg(dev->dev, "RX overrun (ch_id=%d)\n", i);
|
|
+ rxor_count++;
|
|
+ WRITE_ONCE(dev->rx_overrun_count, rxor_count);
|
|
irq_valid = true;
|
|
}
|
|
}
|
|
@@ -622,7 +627,8 @@ static int dw_i2s_probe(struct platform_device *pdev)
|
|
const struct i2s_platform_data *pdata = pdev->dev.platform_data;
|
|
struct dw_i2s_dev *dev;
|
|
struct resource *res;
|
|
- int ret, irq;
|
|
+ int ret, irq, irq_count;
|
|
+ unsigned idx;
|
|
struct snd_soc_dai_driver *dw_i2s_dai;
|
|
const char *clk_id;
|
|
|
|
@@ -643,13 +649,23 @@ static int dw_i2s_probe(struct platform_device *pdev)
|
|
|
|
dev->dev = &pdev->dev;
|
|
|
|
- irq = platform_get_irq(pdev, 0);
|
|
- if (irq >= 0) {
|
|
- ret = devm_request_irq(&pdev->dev, irq, i2s_irq_handler, 0,
|
|
- pdev->name, dev);
|
|
- if (ret < 0) {
|
|
- dev_err(&pdev->dev, "failed to request irq\n");
|
|
- return ret;
|
|
+ irq_count = platform_irq_count(pdev);
|
|
+ if (irq_count < 0) /* - EPROBE_DEFER */
|
|
+ return irq_count;
|
|
+ else if (!irq_count) {
|
|
+ dev_err(&pdev->dev, "no IRQs found for device\n");
|
|
+ return -ENODEV;
|
|
+ }
|
|
+
|
|
+ for (idx = 0; idx < (unsigned)irq_count; idx++) {
|
|
+ irq = platform_get_irq(pdev, idx);
|
|
+ if (irq >= 0) {
|
|
+ ret = devm_request_irq(&pdev->dev, irq, i2s_irq_handler, 0,
|
|
+ pdev->name, dev);
|
|
+ if (ret < 0) {
|
|
+ dev_err(&pdev->dev, "failed to request irq\n");
|
|
+ return ret;
|
|
+ }
|
|
}
|
|
}
|
|
|
|
diff --git a/sound/soc/dwc/local.h b/sound/soc/dwc/local.h
|
|
index 91dc70a826f8..49167d89daae 100644
|
|
--- a/sound/soc/dwc/local.h
|
|
+++ b/sound/soc/dwc/local.h
|
|
@@ -117,6 +117,7 @@ struct dw_i2s_dev {
|
|
bool *period_elapsed);
|
|
unsigned int tx_ptr;
|
|
unsigned int rx_ptr;
|
|
+ unsigned int rx_overrun_count;
|
|
};
|
|
|
|
#if IS_ENABLED(CONFIG_SND_DESIGNWARE_PCM)
|
|
--
|
|
2.31.1
|
|
|