History

soundwire: bus: initialize bus clock base and scale registers

The SoundWire 1.2 specification adds new registers to allow for seamless clock changes while audio transfers are on-going. Program them following the specification. Note that dynamic clock changes are not supported for now, this only adds the register initialization.

Pierre-Louis Bossart committed 6 years ago

Commit 29d158f1 parent b5924262 files · +117 −0Browse files

Unified · Split

2 files
  1. drivers/soundwire/bus.c +107 −0
  2. include/linux/soundwire/sdw_registers.h +10 −0
drivers/soundwire/bus.c+107−0
@@ -1070,12 +1070,119 @@ int sdw_configure_dpn_intr(struct sdw_slave *slave, · 1069 unmodified lines
1070 return ret;1070 return ret;
1071}1071}
1072 1072
1073static int sdw_slave_set_frequency(struct sdw_slave *slave)
1074{
1075 u32 mclk_freq = slave->bus->prop.mclk_freq;
1076 u32 curr_freq = slave->bus->params.curr_dr_freq >> 1;
1077 unsigned int scale;
1078 u8 scale_index;
1079 u8 base;
1080 int ret;
1081
1082 /*
1083 * frequency base and scale registers are required for SDCA
1084 * devices. They may also be used for 1.2+/non-SDCA devices,
1085 * but we will need a DisCo property to cover this case
1086 */
1087 if (!slave->id.class_id)
1088 return 0;
1089
1090 if (!mclk_freq) {
1091 dev_err(&slave->dev,
1092 "no bus MCLK, cannot set SDW_SCP_BUS_CLOCK_BASE\n");
1093 return -EINVAL;
1094 }
1095
1096 /*
1097 * map base frequency using Table 89 of SoundWire 1.2 spec.
1098 * The order of the tests just follows the specification, this
1099 * is not a selection between possible values or a search for
1100 * the best value but just a mapping. Only one case per platform
1101 * is relevant.
1102 * Some BIOS have inconsistent values for mclk_freq but a
1103 * correct root so we force the mclk_freq to avoid variations.
1104 */
1105 if (!(19200000 % mclk_freq)) {
1106 mclk_freq = 19200000;
1107 base = SDW_SCP_BASE_CLOCK_19200000_HZ;
1108 } else if (!(24000000 % mclk_freq)) {
1109 mclk_freq = 24000000;
1110 base = SDW_SCP_BASE_CLOCK_24000000_HZ;
1111 } else if (!(24576000 % mclk_freq)) {
1112 mclk_freq = 24576000;
1113 base = SDW_SCP_BASE_CLOCK_24576000_HZ;
1114 } else if (!(22579200 % mclk_freq)) {
1115 mclk_freq = 22579200;
1116 base = SDW_SCP_BASE_CLOCK_22579200_HZ;
1117 } else if (!(32000000 % mclk_freq)) {
1118 mclk_freq = 32000000;
1119 base = SDW_SCP_BASE_CLOCK_32000000_HZ;
1120 } else {
1121 dev_err(&slave->dev,
1122 "Unsupported clock base, mclk %d\n",
1123 mclk_freq);
1124 return -EINVAL;
1125 }
1126
1127 if (mclk_freq % curr_freq) {
1128 dev_err(&slave->dev,
1129 "mclk %d is not multiple of bus curr_freq %d\n",
1130 mclk_freq, curr_freq);
1131 return -EINVAL;
1132 }
1133
1134 scale = mclk_freq / curr_freq;
1135
1136 /*
1137 * map scale to Table 90 of SoundWire 1.2 spec - and check
1138 * that the scale is a power of two and maximum 64
1139 */
1140 scale_index = ilog2(scale);
1141
1142 if (BIT(scale_index) != scale || scale_index > 6) {
1143 dev_err(&slave->dev,
1144 "No match found for scale %d, bus mclk %d curr_freq %d\n",
1145 scale, mclk_freq, curr_freq);
1146 return -EINVAL;
1147 }
1148 scale_index++;
1149
1150 ret = sdw_write(slave, SDW_SCP_BUS_CLOCK_BASE, base);
1151 if (ret < 0) {
1152 dev_err(&slave->dev,
1153 "SDW_SCP_BUS_CLOCK_BASE write failed:%d\n", ret);
1154 return ret;
1155 }
1156
1157 /* initialize scale for both banks */
1158 ret = sdw_write(slave, SDW_SCP_BUSCLOCK_SCALE_B0, scale_index);
1159 if (ret < 0) {
1160 dev_err(&slave->dev,
1161 "SDW_SCP_BUSCLOCK_SCALE_B0 write failed:%d\n", ret);
1162 return ret;
1163 }
1164 ret = sdw_write(slave, SDW_SCP_BUSCLOCK_SCALE_B1, scale_index);
1165 if (ret < 0)
1166 dev_err(&slave->dev,
1167 "SDW_SCP_BUSCLOCK_SCALE_B1 write failed:%d\n", ret);
1168
1169 dev_dbg(&slave->dev,
1170 "Configured bus base %d, scale %d, mclk %d, curr_freq %d\n",
1171 base, scale_index, mclk_freq, curr_freq);
1172
1173 return ret;
1174}
1175
1073static int sdw_initialize_slave(struct sdw_slave *slave)1176static int sdw_initialize_slave(struct sdw_slave *slave)
1074{1177{
1075 struct sdw_slave_prop *prop = &slave->prop;1178 struct sdw_slave_prop *prop = &slave->prop;
1076 int ret;1179 int ret;
1077 u8 val;1180 u8 val;
1078 1181
1182 ret = sdw_slave_set_frequency(slave);
1183 if (ret < 0)
1184 return ret;
1185
1079 /*1186 /*
1080 * Set bus clash, parity and SCP implementation1187 * Set bus clash, parity and SCP implementation
1081 * defined interrupt mask1188 * defined interrupt mask
include/linux/soundwire/sdw_registers.h+10−0
@@ -109,8 +109,18 @@ · 108 unmodified lines
109#define SDW_SCP_KEEPEREN 0x4A109#define SDW_SCP_KEEPEREN 0x4A
110#define SDW_SCP_BANKDELAY 0x4B110#define SDW_SCP_BANKDELAY 0x4B
111#define SDW_SCP_COMMIT 0x4C111#define SDW_SCP_COMMIT 0x4C
112
112#define SDW_SCP_BUS_CLOCK_BASE 0x4D113#define SDW_SCP_BUS_CLOCK_BASE 0x4D
113#define SDW_SCP_BASE_CLOCK_FREQ GENMASK(2, 0)114#define SDW_SCP_BASE_CLOCK_FREQ GENMASK(2, 0)
115#define SDW_SCP_BASE_CLOCK_UNKNOWN 0x0
116#define SDW_SCP_BASE_CLOCK_19200000_HZ 0x1
117#define SDW_SCP_BASE_CLOCK_24000000_HZ 0x2
118#define SDW_SCP_BASE_CLOCK_24576000_HZ 0x3
119#define SDW_SCP_BASE_CLOCK_22579200_HZ 0x4
120#define SDW_SCP_BASE_CLOCK_32000000_HZ 0x5
121#define SDW_SCP_BASE_CLOCK_RESERVED 0x6
122#define SDW_SCP_BASE_CLOCK_IMP_DEF 0x7
123
114/* 0x4E is not allocated in SoundWire specification 1.2 */124/* 0x4E is not allocated in SoundWire specification 1.2 */
115#define SDW_SCP_TESTMODE 0x4F125#define SDW_SCP_TESTMODE 0x4F
116#define SDW_SCP_DEVID_0 0x50126#define SDW_SCP_DEVID_0 0x50

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t