Skip to content

Commit 9ad55a6

Browse files
committed
Merge tag 'soundwire-6.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/soundwire
Pull soundwire updates from Vinod Koul: - structure optimization of few bus structures and header updates - support for 2.0 disco spec - amd driver updates for acp revision, refactoring code and support for acp6.3 - soft reset support for cadence driver * tag 'soundwire-6.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/soundwire: (24 commits) soundwire: Minor formatting fixups in sdw.h header soundwire: Update the includes on the sdw.h header soundwire: cadence: clear MCP BLOCK_WAKEUP in init soundwire: cadence: add soft-reset on startup soundwire: intel_auxdevice: add kernel parameter for mclk divider soundwire: mipi-disco: add support for DP0/DPn 'lane-list' property soundwire: mipi-disco: add new properties from 2.0 spec soundwire: mipi-disco: add comment on DP0-supported property soundwire: mipi-disco: add support for peripheral channelprepare timeout soundwire: mipi_disco: add support for clock-scales property soundwire: mipi-disco: add error handling for property array read soundwire: mipi-disco: remove DPn audio-modes soundwire: optimize sdw_dpn_prop soundwire: optimize sdw_dp0_prop soundwire: optimize sdw_slave_prop soundwire: optimize sdw_bus structure soundwire: optimize sdw_master_prop soundwire: optimize sdw_stream_runtime memory layout soundwire: mipi_disco: add MIPI-specific property_read_bool() helpers soundwire: Correct some typos in comments ...
2 parents 0ce9a5f + dd690b3 commit 9ad55a6

File tree

18 files changed

+366
-206
lines changed

18 files changed

+366
-206
lines changed

Documentation/admin-guide/kernel-parameters.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ is applicable::
174174
SCSI Appropriate SCSI support is enabled.
175175
A lot of drivers have their options described inside
176176
the Documentation/scsi/ sub-directory.
177+
SDW SoundWire support is enabled.
177178
SECURITY Different security models are enabled.
178179
SELINUX SELinux support is enabled.
179180
SERIAL Serial support is enabled.

Documentation/admin-guide/kernel-parameters.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6075,6 +6075,10 @@
60756075
non-zero "wait" parameter. See weight_single
60766076
and weight_many.
60776077

6078+
sdw_mclk_divider=[SDW]
6079+
Specify the MCLK divider for Intel SoundWire buses in
6080+
case the BIOS does not provide the clock rate properly.
6081+
60786082
skew_tick= [KNL,EARLY] Offset the periodic timer tick per cpu to mitigate
60796083
xtime_lock contention on larger systems, and/or RCU lock
60806084
contention on all systems with CONFIG_MAXSMP set.

drivers/soundwire/amd_init.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ static struct sdw_amd_ctx *sdw_amd_probe_controller(struct sdw_amd_res *res)
121121

122122
sdw_pdata[index].instance = index;
123123
sdw_pdata[index].acp_sdw_lock = res->acp_lock;
124+
sdw_pdata[index].acp_rev = res->acp_rev;
124125
pdevinfo[index].name = "amd_sdw_manager";
125126
pdevinfo[index].id = index;
126127
pdevinfo[index].parent = res->parent;

drivers/soundwire/amd_manager.c

Lines changed: 64 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -433,12 +433,18 @@ static int amd_sdw_port_params(struct sdw_bus *bus, struct sdw_port_params *p_pa
433433
u32 frame_fmt_reg, dpn_frame_fmt;
434434

435435
dev_dbg(amd_manager->dev, "p_params->num:0x%x\n", p_params->num);
436-
switch (amd_manager->instance) {
437-
case ACP_SDW0:
438-
frame_fmt_reg = sdw0_manager_dp_reg[p_params->num].frame_fmt_reg;
439-
break;
440-
case ACP_SDW1:
441-
frame_fmt_reg = sdw1_manager_dp_reg[p_params->num].frame_fmt_reg;
436+
switch (amd_manager->acp_rev) {
437+
case ACP63_PCI_REV_ID:
438+
switch (amd_manager->instance) {
439+
case ACP_SDW0:
440+
frame_fmt_reg = acp63_sdw0_dp_reg[p_params->num].frame_fmt_reg;
441+
break;
442+
case ACP_SDW1:
443+
frame_fmt_reg = acp63_sdw1_dp_reg[p_params->num].frame_fmt_reg;
444+
break;
445+
default:
446+
return -EINVAL;
447+
}
442448
break;
443449
default:
444450
return -EINVAL;
@@ -465,20 +471,28 @@ static int amd_sdw_transport_params(struct sdw_bus *bus,
465471
u32 frame_fmt_reg, sample_int_reg, hctrl_dp0_reg;
466472
u32 offset_reg, lane_ctrl_ch_en_reg;
467473

468-
switch (amd_manager->instance) {
469-
case ACP_SDW0:
470-
frame_fmt_reg = sdw0_manager_dp_reg[params->port_num].frame_fmt_reg;
471-
sample_int_reg = sdw0_manager_dp_reg[params->port_num].sample_int_reg;
472-
hctrl_dp0_reg = sdw0_manager_dp_reg[params->port_num].hctrl_dp0_reg;
473-
offset_reg = sdw0_manager_dp_reg[params->port_num].offset_reg;
474-
lane_ctrl_ch_en_reg = sdw0_manager_dp_reg[params->port_num].lane_ctrl_ch_en_reg;
475-
break;
476-
case ACP_SDW1:
477-
frame_fmt_reg = sdw1_manager_dp_reg[params->port_num].frame_fmt_reg;
478-
sample_int_reg = sdw1_manager_dp_reg[params->port_num].sample_int_reg;
479-
hctrl_dp0_reg = sdw1_manager_dp_reg[params->port_num].hctrl_dp0_reg;
480-
offset_reg = sdw1_manager_dp_reg[params->port_num].offset_reg;
481-
lane_ctrl_ch_en_reg = sdw1_manager_dp_reg[params->port_num].lane_ctrl_ch_en_reg;
474+
switch (amd_manager->acp_rev) {
475+
case ACP63_PCI_REV_ID:
476+
switch (amd_manager->instance) {
477+
case ACP_SDW0:
478+
frame_fmt_reg = acp63_sdw0_dp_reg[params->port_num].frame_fmt_reg;
479+
sample_int_reg = acp63_sdw0_dp_reg[params->port_num].sample_int_reg;
480+
hctrl_dp0_reg = acp63_sdw0_dp_reg[params->port_num].hctrl_dp0_reg;
481+
offset_reg = acp63_sdw0_dp_reg[params->port_num].offset_reg;
482+
lane_ctrl_ch_en_reg =
483+
acp63_sdw0_dp_reg[params->port_num].lane_ctrl_ch_en_reg;
484+
break;
485+
case ACP_SDW1:
486+
frame_fmt_reg = acp63_sdw1_dp_reg[params->port_num].frame_fmt_reg;
487+
sample_int_reg = acp63_sdw1_dp_reg[params->port_num].sample_int_reg;
488+
hctrl_dp0_reg = acp63_sdw1_dp_reg[params->port_num].hctrl_dp0_reg;
489+
offset_reg = acp63_sdw1_dp_reg[params->port_num].offset_reg;
490+
lane_ctrl_ch_en_reg =
491+
acp63_sdw1_dp_reg[params->port_num].lane_ctrl_ch_en_reg;
492+
break;
493+
default:
494+
return -EINVAL;
495+
}
482496
break;
483497
default:
484498
return -EINVAL;
@@ -520,12 +534,20 @@ static int amd_sdw_port_enable(struct sdw_bus *bus,
520534
u32 dpn_ch_enable;
521535
u32 lane_ctrl_ch_en_reg;
522536

523-
switch (amd_manager->instance) {
524-
case ACP_SDW0:
525-
lane_ctrl_ch_en_reg = sdw0_manager_dp_reg[enable_ch->port_num].lane_ctrl_ch_en_reg;
526-
break;
527-
case ACP_SDW1:
528-
lane_ctrl_ch_en_reg = sdw1_manager_dp_reg[enable_ch->port_num].lane_ctrl_ch_en_reg;
537+
switch (amd_manager->acp_rev) {
538+
case ACP63_PCI_REV_ID:
539+
switch (amd_manager->instance) {
540+
case ACP_SDW0:
541+
lane_ctrl_ch_en_reg =
542+
acp63_sdw0_dp_reg[enable_ch->port_num].lane_ctrl_ch_en_reg;
543+
break;
544+
case ACP_SDW1:
545+
lane_ctrl_ch_en_reg =
546+
acp63_sdw1_dp_reg[enable_ch->port_num].lane_ctrl_ch_en_reg;
547+
break;
548+
default:
549+
return -EINVAL;
550+
}
529551
break;
530552
default:
531553
return -EINVAL;
@@ -910,6 +932,7 @@ static int amd_sdw_manager_probe(struct platform_device *pdev)
910932
amd_manager->mmio = amd_manager->acp_mmio +
911933
(amd_manager->instance * SDW_MANAGER_REG_OFFSET);
912934
amd_manager->acp_sdw_lock = pdata->acp_sdw_lock;
935+
amd_manager->acp_rev = pdata->acp_rev;
913936
amd_manager->cols_index = sdw_find_col_index(AMD_SDW_DEFAULT_COLUMNS);
914937
amd_manager->rows_index = sdw_find_row_index(AMD_SDW_DEFAULT_ROWS);
915938
amd_manager->dev = dev;
@@ -926,15 +949,21 @@ static int amd_sdw_manager_probe(struct platform_device *pdev)
926949
* information.
927950
*/
928951
amd_manager->bus.controller_id = 0;
929-
930-
switch (amd_manager->instance) {
931-
case ACP_SDW0:
932-
amd_manager->num_dout_ports = AMD_SDW0_MAX_TX_PORTS;
933-
amd_manager->num_din_ports = AMD_SDW0_MAX_RX_PORTS;
934-
break;
935-
case ACP_SDW1:
936-
amd_manager->num_dout_ports = AMD_SDW1_MAX_TX_PORTS;
937-
amd_manager->num_din_ports = AMD_SDW1_MAX_RX_PORTS;
952+
dev_dbg(dev, "acp_rev:0x%x\n", amd_manager->acp_rev);
953+
switch (amd_manager->acp_rev) {
954+
case ACP63_PCI_REV_ID:
955+
switch (amd_manager->instance) {
956+
case ACP_SDW0:
957+
amd_manager->num_dout_ports = AMD_ACP63_SDW0_MAX_TX_PORTS;
958+
amd_manager->num_din_ports = AMD_ACP63_SDW0_MAX_RX_PORTS;
959+
break;
960+
case ACP_SDW1:
961+
amd_manager->num_dout_ports = AMD_ACP63_SDW1_MAX_TX_PORTS;
962+
amd_manager->num_din_ports = AMD_ACP63_SDW1_MAX_RX_PORTS;
963+
break;
964+
default:
965+
return -EINVAL;
966+
}
938967
break;
939968
default:
940969
return -EINVAL;

drivers/soundwire/amd_manager.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -155,12 +155,12 @@
155155
#define AMD_SDW_IRQ_MASK_8TO11 0x000c7777
156156
#define AMD_SDW_IRQ_ERROR_MASK 0xff
157157
#define AMD_SDW_MAX_FREQ_NUM 1
158-
#define AMD_SDW0_MAX_TX_PORTS 3
159-
#define AMD_SDW0_MAX_RX_PORTS 3
160-
#define AMD_SDW1_MAX_TX_PORTS 1
161-
#define AMD_SDW1_MAX_RX_PORTS 1
162-
#define AMD_SDW0_MAX_DAI 6
163-
#define AMD_SDW1_MAX_DAI 2
158+
#define AMD_ACP63_SDW0_MAX_TX_PORTS 3
159+
#define AMD_ACP63_SDW0_MAX_RX_PORTS 3
160+
#define AMD_ACP63_SDW1_MAX_TX_PORTS 1
161+
#define AMD_ACP63_SDW1_MAX_RX_PORTS 1
162+
#define AMD_ACP63_SDW0_MAX_DAI 6
163+
#define AMD_ACP63_SDW1_MAX_DAI 2
164164
#define AMD_SDW_SLAVE_0_ATTACHED 5
165165
#define AMD_SDW_SSP_COUNTER_VAL 3
166166

@@ -222,7 +222,7 @@ struct sdw_manager_dp_reg {
222222
* in SoundWire DMA driver.
223223
*/
224224

225-
static struct sdw_manager_dp_reg sdw0_manager_dp_reg[AMD_SDW0_MAX_DAI] = {
225+
static struct sdw_manager_dp_reg acp63_sdw0_dp_reg[AMD_ACP63_SDW0_MAX_DAI] = {
226226
{ACP_SW_AUDIO0_TX_FRAME_FORMAT, ACP_SW_AUDIO0_TX_SAMPLEINTERVAL, ACP_SW_AUDIO0_TX_HCTRL_DP0,
227227
ACP_SW_AUDIO0_TX_OFFSET_DP0, ACP_SW_AUDIO0_TX_CHANNEL_ENABLE_DP0},
228228
{ACP_SW_AUDIO1_TX_FRAME_FORMAT, ACP_SW_AUDIO1_TX_SAMPLEINTERVAL, ACP_SW_AUDIO1_TX_HCTRL,
@@ -237,7 +237,7 @@ static struct sdw_manager_dp_reg sdw0_manager_dp_reg[AMD_SDW0_MAX_DAI] = {
237237
ACP_SW_AUDIO2_RX_OFFSET, ACP_SW_AUDIO2_RX_CHANNEL_ENABLE_DP0},
238238
};
239239

240-
static struct sdw_manager_dp_reg sdw1_manager_dp_reg[AMD_SDW1_MAX_DAI] = {
240+
static struct sdw_manager_dp_reg acp63_sdw1_dp_reg[AMD_ACP63_SDW1_MAX_DAI] = {
241241
{ACP_SW_AUDIO1_TX_FRAME_FORMAT, ACP_SW_AUDIO1_TX_SAMPLEINTERVAL, ACP_SW_AUDIO1_TX_HCTRL,
242242
ACP_SW_AUDIO1_TX_OFFSET, ACP_SW_AUDIO1_TX_CHANNEL_ENABLE_DP0},
243243
{ACP_SW_AUDIO1_RX_FRAME_FORMAT, ACP_SW_AUDIO1_RX_SAMPLEINTERVAL, ACP_SW_AUDIO1_RX_HCTRL,

drivers/soundwire/bus.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ int sdw_bus_master_add(struct sdw_bus *bus, struct device *parent,
112112
/* Set higher order bits */
113113
*bus->assigned = ~GENMASK(SDW_BROADCAST_DEV_NUM, SDW_ENUM_DEV_NUM);
114114

115-
/* Set enumuration device number and broadcast device number */
115+
/* Set enumeration device number and broadcast device number */
116116
set_bit(SDW_ENUM_DEV_NUM, bus->assigned);
117117
set_bit(SDW_BROADCAST_DEV_NUM, bus->assigned);
118118

drivers/soundwire/cadence_master.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1377,6 +1377,31 @@ static void cdns_init_clock_ctrl(struct sdw_cdns *cdns)
13771377
cdns_writel(cdns, CDNS_MCP_SSP_CTRL1, ssp_interval);
13781378
}
13791379

1380+
/**
1381+
* sdw_cdns_soft_reset() - Cadence soft-reset
1382+
* @cdns: Cadence instance
1383+
*/
1384+
int sdw_cdns_soft_reset(struct sdw_cdns *cdns)
1385+
{
1386+
int ret;
1387+
1388+
cdns_updatel(cdns, CDNS_MCP_CONTROL, CDNS_MCP_CONTROL_SOFT_RST,
1389+
CDNS_MCP_CONTROL_SOFT_RST);
1390+
1391+
ret = cdns_config_update(cdns);
1392+
if (ret < 0) {
1393+
dev_err(cdns->dev, "%s: config update failed\n", __func__);
1394+
return ret;
1395+
}
1396+
1397+
ret = cdns_set_wait(cdns, CDNS_MCP_CONTROL, CDNS_MCP_CONTROL_SOFT_RST, 0);
1398+
if (ret < 0)
1399+
dev_err(cdns->dev, "%s: Soft Reset timed out\n", __func__);
1400+
1401+
return ret;
1402+
}
1403+
EXPORT_SYMBOL(sdw_cdns_soft_reset);
1404+
13801405
/**
13811406
* sdw_cdns_init() - Cadence initialization
13821407
* @cdns: Cadence instance
@@ -1400,6 +1425,11 @@ int sdw_cdns_init(struct sdw_cdns *cdns)
14001425
cdns_ip_updatel(cdns, CDNS_IP_MCP_CONTROL, CDNS_IP_MCP_CONTROL_CMD_ACCEPT,
14011426
CDNS_IP_MCP_CONTROL_CMD_ACCEPT);
14021427

1428+
/* disable wakeup */
1429+
cdns_ip_updatel(cdns, CDNS_IP_MCP_CONTROL,
1430+
CDNS_IP_MCP_CONTROL_BLOCK_WAKEUP,
1431+
0);
1432+
14031433
/* Configure mcp config */
14041434
val = cdns_readl(cdns, CDNS_MCP_CONFIG);
14051435

drivers/soundwire/cadence_master.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ int sdw_cdns_probe(struct sdw_cdns *cdns);
168168
irqreturn_t sdw_cdns_irq(int irq, void *dev_id);
169169
irqreturn_t sdw_cdns_thread(int irq, void *dev_id);
170170

171+
int sdw_cdns_soft_reset(struct sdw_cdns *cdns);
171172
int sdw_cdns_init(struct sdw_cdns *cdns);
172173
int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
173174
struct sdw_cdns_stream_config config);

drivers/soundwire/intel_auxdevice.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ static int md_flags;
4141
module_param_named(sdw_md_flags, md_flags, int, 0444);
4242
MODULE_PARM_DESC(sdw_md_flags, "SoundWire Intel Master device flags (0x0 all off)");
4343

44+
static int mclk_divider;
45+
module_param_named(sdw_mclk_divider, mclk_divider, int, 0444);
46+
MODULE_PARM_DESC(sdw_mclk_divider, "SoundWire Intel mclk divider");
47+
4448
struct wake_capable_part {
4549
const u16 mfg_id;
4650
const u16 part_id;
@@ -142,8 +146,12 @@ static int sdw_master_read_intel_prop(struct sdw_bus *bus)
142146
"intel-sdw-ip-clock",
143147
&prop->mclk_freq);
144148

145-
/* the values reported by BIOS are the 2x clock, not the bus clock */
146-
prop->mclk_freq /= 2;
149+
if (mclk_divider)
150+
/* use kernel parameter for BIOS or board work-arounds */
151+
prop->mclk_freq /= mclk_divider;
152+
else
153+
/* the values reported by BIOS are the 2x clock, not the bus clock */
154+
prop->mclk_freq /= 2;
147155

148156
fwnode_property_read_u32(link,
149157
"intel-quirk-mask",

drivers/soundwire/intel_bus_common.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@ int intel_start_bus(struct sdw_intel *sdw)
1616
struct sdw_bus *bus = &cdns->bus;
1717
int ret;
1818

19+
ret = sdw_cdns_soft_reset(cdns);
20+
if (ret < 0) {
21+
dev_err(dev, "%s: unable to soft-reset Cadence IP: %d\n", __func__, ret);
22+
return ret;
23+
}
24+
1925
/*
2026
* follow recommended programming flows to avoid timeouts when
2127
* gsync is enabled

0 commit comments

Comments
 (0)