mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-06-21 15:43:21 +02:00
27ab4f1e49
For current platforms(ACP6.3/ACP7.0/ACP7.1/ACP7.2), AMD SoundWire manager doesn't have banked registers for data port programming on Manager's side. Need to use fixed block offsets, hstart & hstop for manager ports. Earlier amd manager driver has support for 12 MHz as a bus clock frequency where frame rate is 48000 and number of bits is 500, frame shape as 50 x 10 with fixed block offset mapping based on port number. Got a new requirement to support 6 MHz as a bus clock frequency. For 6 MHz bus clock frequency amd manager driver needs to support two different frame shapes i.e number of bits as 250 with frame rate as 48000 and frame shape as 125 x 2 and for the second combination number of bits as 500 where frame rate is 24000 and frame shape is 50 x 10. Few SoundWire peripherals doesn't support 125 x 2 as a frame shape for 6 MHz bus clock frequency. They have explicit requirement for the frame shape. In this scenario, amd manager driver needs to use 50 x 10 as a frame shape where frame rate is 24000. Based on the platform and SoundWire topology for 6Mhz support frame shape will be decided which is part of SoundWire manager DisCo tables. For current platforms, amd manager driver supports only two bus clock frequencies(12 MHz & 6 MHz). Refactor bandwidth logic to support different bus clock frequencies. Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.dev> Link: https://patch.msgid.link/20260226065638.1251771-3-Vijendar.Mukunda@amd.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
179 lines
4.7 KiB
C
179 lines
4.7 KiB
C
/* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */
|
|
/*
|
|
* Copyright (C) 2023-24 Advanced Micro Devices, Inc. All rights reserved.
|
|
*/
|
|
|
|
#ifndef __SDW_AMD_H
|
|
#define __SDW_AMD_H
|
|
|
|
#include <linux/acpi.h>
|
|
#include <linux/soundwire/sdw.h>
|
|
|
|
/* AMD pm_runtime quirk definitions */
|
|
|
|
/*
|
|
* Force the clock to stop(ClockStopMode0) when suspend callback
|
|
* is invoked.
|
|
*/
|
|
#define AMD_SDW_CLK_STOP_MODE 1
|
|
|
|
/*
|
|
* Stop the bus when runtime suspend/system level suspend callback
|
|
* is invoked. If set, a complete bus reset and re-enumeration will
|
|
* be performed when the bus restarts. In-band wake interrupts are
|
|
* not supported in this mode.
|
|
*/
|
|
#define AMD_SDW_POWER_OFF_MODE 2
|
|
#define ACP_SDW0 0
|
|
#define ACP_SDW1 1
|
|
#define AMD_SDW_MAX_MANAGER_COUNT 2
|
|
#define ACP63_PCI_REV_ID 0x63
|
|
#define ACP70_PCI_REV_ID 0x70
|
|
#define ACP71_PCI_REV_ID 0x71
|
|
#define ACP72_PCI_REV_ID 0x72
|
|
|
|
struct acp_sdw_pdata {
|
|
u16 instance;
|
|
u32 acp_rev;
|
|
/* mutex to protect acp common register access */
|
|
struct mutex *acp_sdw_lock;
|
|
};
|
|
|
|
/**
|
|
* struct sdw_amd_dai_runtime: AMD sdw dai runtime data
|
|
*
|
|
* @name: SoundWire stream name
|
|
* @stream: stream runtime
|
|
* @bus: Bus handle
|
|
* @stream_type: Stream type
|
|
*/
|
|
struct sdw_amd_dai_runtime {
|
|
char *name;
|
|
struct sdw_stream_runtime *stream;
|
|
struct sdw_bus *bus;
|
|
enum sdw_stream_type stream_type;
|
|
};
|
|
|
|
/**
|
|
* struct amd_sdw_manager - amd manager driver context
|
|
* @bus: bus handle
|
|
* @dev: linux device
|
|
* @mmio: SoundWire registers mmio base
|
|
* @acp_mmio: acp registers mmio base
|
|
* @amd_sdw_irq_thread: SoundWire manager irq workqueue
|
|
* @amd_sdw_work: peripheral status work queue
|
|
* @acp_sdw_lock: mutex to protect acp share register access
|
|
* @status: peripheral devices status array
|
|
* @num_din_ports: number of input ports
|
|
* @num_dout_ports: number of output ports
|
|
* @max_ports: total number of input ports and output ports
|
|
* @cols_index: Column index in frame shape
|
|
* @rows_index: Rows index in frame shape
|
|
* @port_offset_map: dynamic array to map port block offset
|
|
* @instance: SoundWire manager instance
|
|
* @quirks: SoundWire manager quirks
|
|
* @wake_en_mask: wake enable mask per SoundWire manager
|
|
* @acp_rev: acp pci device revision id
|
|
* @clk_stopped: flag set to true when clock is stopped
|
|
* @power_mode_mask: flag interprets amd SoundWire manager power mode
|
|
* @dai_runtime_array: dai runtime array
|
|
*/
|
|
struct amd_sdw_manager {
|
|
struct sdw_bus bus;
|
|
struct device *dev;
|
|
|
|
void __iomem *mmio;
|
|
void __iomem *acp_mmio;
|
|
|
|
struct work_struct amd_sdw_irq_thread;
|
|
struct work_struct amd_sdw_work;
|
|
/* mutex to protect acp common register access */
|
|
struct mutex *acp_sdw_lock;
|
|
|
|
enum sdw_slave_status status[SDW_MAX_DEVICES + 1];
|
|
|
|
int num_din_ports;
|
|
int num_dout_ports;
|
|
int max_ports;
|
|
|
|
int cols_index;
|
|
int rows_index;
|
|
|
|
int *port_offset_map;
|
|
u32 instance;
|
|
u32 quirks;
|
|
u32 wake_en_mask;
|
|
u32 power_mode_mask;
|
|
u32 acp_rev;
|
|
bool clk_stopped;
|
|
|
|
struct sdw_amd_dai_runtime **dai_runtime_array;
|
|
};
|
|
|
|
/**
|
|
* struct sdw_amd_acpi_info - Soundwire AMD information found in ACPI tables
|
|
* @handle: ACPI controller handle
|
|
* @count: maximum no of soundwire manager links supported on AMD platform.
|
|
* @link_mask: bit-wise mask listing links enabled by BIOS menu
|
|
*/
|
|
struct sdw_amd_acpi_info {
|
|
acpi_handle handle;
|
|
int count;
|
|
u32 link_mask;
|
|
};
|
|
|
|
/**
|
|
* struct sdw_amd_ctx - context allocated by the controller driver probe
|
|
*
|
|
* @count: link count
|
|
* @link_mask: bit-wise mask listing SoundWire links reported by the
|
|
* Controller
|
|
* @pdev: platform device structure
|
|
* @peripherals: array representing Peripherals exposed across all enabled links
|
|
*/
|
|
struct sdw_amd_ctx {
|
|
int count;
|
|
u32 link_mask;
|
|
struct platform_device *pdev[AMD_SDW_MAX_MANAGER_COUNT];
|
|
struct sdw_peripherals *peripherals;
|
|
};
|
|
|
|
/**
|
|
* struct sdw_amd_res - Soundwire AMD global resource structure,
|
|
* typically populated by the DSP driver/Legacy driver
|
|
*
|
|
* @acp_rev: acp pci device revision id
|
|
* @addr: acp pci device resource start address
|
|
* @reg_range: ACP register range
|
|
* @link_mask: bit-wise mask listing links selected by the DSP driver/
|
|
* legacy driver
|
|
* @count: link count
|
|
* @mmio_base: mmio base of SoundWire registers
|
|
* @handle: ACPI parent handle
|
|
* @parent: parent device
|
|
* @dev: device implementing hwparams and free callbacks
|
|
* @acp_lock: mutex protecting acp common registers access
|
|
*/
|
|
struct sdw_amd_res {
|
|
u32 acp_rev;
|
|
u32 addr;
|
|
u32 reg_range;
|
|
u32 link_mask;
|
|
int count;
|
|
void __iomem *mmio_base;
|
|
acpi_handle handle;
|
|
struct device *parent;
|
|
struct device *dev;
|
|
/* use to protect acp common registers access */
|
|
struct mutex *acp_lock;
|
|
};
|
|
|
|
int sdw_amd_probe(struct sdw_amd_res *res, struct sdw_amd_ctx **ctx);
|
|
|
|
void sdw_amd_exit(struct sdw_amd_ctx *ctx);
|
|
|
|
int sdw_amd_get_slave_info(struct sdw_amd_ctx *ctx);
|
|
|
|
int amd_sdw_scan_controller(struct sdw_amd_acpi_info *info);
|
|
#endif
|