1 // SPDX-License-Identifier: GPL-2.0-only 2 // 3 // rt721-sdca-sdw.c -- rt721 SDCA ALSA SoC audio driver 4 // 5 // Copyright(c) 2024 Realtek Semiconductor Corp. 6 // 7 // 8 9 #include <linux/delay.h> 10 #include <linux/device.h> 11 #include <linux/module.h> 12 #include <linux/mod_devicetable.h> 13 #include <linux/pm_runtime.h> 14 #include <linux/soundwire/sdw_registers.h> 15 16 #include "rt721-sdca.h" 17 #include "rt721-sdca-sdw.h" 18 #include "rt-sdw-common.h" 19 20 static bool rt721_sdca_readable_register(struct device *dev, unsigned int reg) 21 { 22 switch (reg) { 23 case 0x2f01 ... 0x2f0a: 24 case 0x2f35: 25 case 0x2f50: 26 case 0x2f51: 27 case 0x2f58 ... 0x2f5d: 28 case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT721_SDCA_ENT_XUV, 29 RT721_SDCA_CTL_XUV, 0): 30 case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT721_SDCA_ENT_GE49, 31 RT721_SDCA_CTL_SELECTED_MODE, 0): 32 case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT721_SDCA_ENT_GE49, 33 RT721_SDCA_CTL_DETECTED_MODE, 0): 34 case SDW_SDCA_CTL(FUNC_NUM_HID, RT721_SDCA_ENT_HID01, 35 RT721_SDCA_CTL_HIDTX_CURRENT_OWNER, 0) ... SDW_SDCA_CTL(FUNC_NUM_HID, 36 RT721_SDCA_ENT_HID01, RT721_SDCA_CTL_HIDTX_MESSAGE_LENGTH, 0): 37 case RT721_BUF_ADDR_HID1 ... RT721_BUF_ADDR_HID2: 38 return true; 39 default: 40 return false; 41 } 42 } 43 44 static bool rt721_sdca_volatile_register(struct device *dev, unsigned int reg) 45 { 46 switch (reg) { 47 case 0x2f01: 48 case 0x2f51: 49 case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT721_SDCA_ENT_GE49, 50 RT721_SDCA_CTL_DETECTED_MODE, 0): 51 case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT721_SDCA_ENT_XUV, 52 RT721_SDCA_CTL_XUV, 0): 53 case SDW_SDCA_CTL(FUNC_NUM_HID, RT721_SDCA_ENT_HID01, 54 RT721_SDCA_CTL_HIDTX_CURRENT_OWNER, 0) ... SDW_SDCA_CTL(FUNC_NUM_HID, 55 RT721_SDCA_ENT_HID01, RT721_SDCA_CTL_HIDTX_MESSAGE_LENGTH, 0): 56 case RT721_BUF_ADDR_HID1 ... RT721_BUF_ADDR_HID2: 57 return true; 58 default: 59 return false; 60 } 61 } 62 63 static bool rt721_sdca_mbq_readable_register(struct device *dev, unsigned int reg) 64 { 65 switch (reg) { 66 case 0x0900004 ... 0x0900009: 67 case 0x0a00005: 68 case 0x0c00005: 69 case 0x0d00014: 70 case 0x0310100: 71 case 0x2000000 ... 0x2000003: 72 case 0x2000013: 73 case 0x200002c: 74 case 0x200003c: 75 case 0x2000046: 76 case 0x5810000: 77 case 0x5810036: 78 case 0x5810037: 79 case 0x5810038: 80 case 0x5810039: 81 case 0x5b10018: 82 case 0x5b10019: 83 case 0x5f00045: 84 case 0x5f00048: 85 case 0x6100000: 86 case 0x6100005: 87 case 0x6100006: 88 case 0x610000d: 89 case 0x6100010: 90 case 0x6100011: 91 case 0x6100013: 92 case 0x6100015: 93 case 0x6100017: 94 case 0x6100025: 95 case 0x6100029: 96 case 0x610002c ... 0x610002f: 97 case 0x6100053 ... 0x6100055: 98 case 0x6100057: 99 case 0x610005a: 100 case 0x610005b: 101 case 0x610006a: 102 case 0x610006d: 103 case 0x6100092: 104 case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT721_SDCA_ENT_USER_FU05, RT721_SDCA_CTL_FU_VOLUME, 105 CH_L): 106 case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT721_SDCA_ENT_USER_FU05, RT721_SDCA_CTL_FU_VOLUME, 107 CH_R): 108 case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT721_SDCA_ENT_USER_FU0F, RT721_SDCA_CTL_FU_VOLUME, 109 CH_L): 110 case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT721_SDCA_ENT_USER_FU0F, RT721_SDCA_CTL_FU_VOLUME, 111 CH_R): 112 case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT721_SDCA_ENT_PLATFORM_FU44, 113 RT721_SDCA_CTL_FU_CH_GAIN, CH_L): 114 case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT721_SDCA_ENT_PLATFORM_FU44, 115 RT721_SDCA_CTL_FU_CH_GAIN, CH_R): 116 case SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT721_SDCA_ENT_USER_FU1E, RT721_SDCA_CTL_FU_VOLUME, 117 CH_01): 118 case SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT721_SDCA_ENT_USER_FU1E, RT721_SDCA_CTL_FU_VOLUME, 119 CH_02): 120 case SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT721_SDCA_ENT_USER_FU1E, RT721_SDCA_CTL_FU_VOLUME, 121 CH_03): 122 case SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT721_SDCA_ENT_USER_FU1E, RT721_SDCA_CTL_FU_VOLUME, 123 CH_04): 124 case SDW_SDCA_CTL(FUNC_NUM_AMP, RT721_SDCA_ENT_USER_FU06, RT721_SDCA_CTL_FU_VOLUME, CH_L): 125 case SDW_SDCA_CTL(FUNC_NUM_AMP, RT721_SDCA_ENT_USER_FU06, RT721_SDCA_CTL_FU_VOLUME, CH_R): 126 return true; 127 default: 128 return false; 129 } 130 } 131 132 static bool rt721_sdca_mbq_volatile_register(struct device *dev, unsigned int reg) 133 { 134 switch (reg) { 135 case 0x0310100: 136 case 0x0900005: 137 case 0x0900009: 138 case 0x0a00005: 139 case 0x0c00005: 140 case 0x0d00014: 141 case 0x2000000: 142 case 0x200000d: 143 case 0x2000019: 144 case 0x2000020: 145 case 0x200002c: 146 case 0x2000030: 147 case 0x2000046: 148 case 0x2000067: 149 case 0x2000084: 150 case 0x2000086: 151 case 0x5810000: 152 case 0x5810036: 153 case 0x5810037: 154 case 0x5810038: 155 case 0x5810039: 156 case 0x5b10018: 157 case 0x5b10019: 158 return true; 159 default: 160 return false; 161 } 162 } 163 164 static const struct regmap_config rt721_sdca_regmap = { 165 .reg_bits = 32, 166 .val_bits = 8, 167 .readable_reg = rt721_sdca_readable_register, 168 .volatile_reg = rt721_sdca_volatile_register, 169 .max_register = 0x44ffffff, 170 .reg_defaults = rt721_sdca_reg_defaults, 171 .num_reg_defaults = ARRAY_SIZE(rt721_sdca_reg_defaults), 172 .cache_type = REGCACHE_MAPLE, 173 .use_single_read = true, 174 .use_single_write = true, 175 }; 176 177 static const struct regmap_config rt721_sdca_mbq_regmap = { 178 .name = "sdw-mbq", 179 .reg_bits = 32, 180 .val_bits = 16, 181 .readable_reg = rt721_sdca_mbq_readable_register, 182 .volatile_reg = rt721_sdca_mbq_volatile_register, 183 .max_register = 0x41000312, 184 .reg_defaults = rt721_sdca_mbq_defaults, 185 .num_reg_defaults = ARRAY_SIZE(rt721_sdca_mbq_defaults), 186 .cache_type = REGCACHE_MAPLE, 187 .use_single_read = true, 188 .use_single_write = true, 189 }; 190 191 static int rt721_sdca_update_status(struct sdw_slave *slave, 192 enum sdw_slave_status status) 193 { 194 struct rt721_sdca_priv *rt721 = dev_get_drvdata(&slave->dev); 195 196 if (status == SDW_SLAVE_UNATTACHED) 197 rt721->hw_init = false; 198 199 if (status == SDW_SLAVE_ATTACHED) { 200 if (rt721->hs_jack) { 201 /* 202 * Due to the SCP_SDCA_INTMASK will be cleared by any reset, and then 203 * if the device attached again, we will need to set the setting back. 204 * It could avoid losing the jack detection interrupt. 205 * This also could sync with the cache value as the rt721_sdca_jack_init set. 206 */ 207 sdw_write_no_pm(rt721->slave, SDW_SCP_SDCA_INTMASK1, 208 SDW_SCP_SDCA_INTMASK_SDCA_0); 209 sdw_write_no_pm(rt721->slave, SDW_SCP_SDCA_INTMASK2, 210 SDW_SCP_SDCA_INTMASK_SDCA_8); 211 } 212 } 213 214 /* 215 * Perform initialization only if slave status is present and 216 * hw_init flag is false 217 */ 218 if (rt721->hw_init || status != SDW_SLAVE_ATTACHED) 219 return 0; 220 221 /* perform I/O transfers required for Slave initialization */ 222 return rt721_sdca_io_init(&slave->dev, slave); 223 } 224 225 static int rt721_sdca_read_prop(struct sdw_slave *slave) 226 { 227 struct sdw_slave_prop *prop = &slave->prop; 228 int nval; 229 int i, j; 230 u32 bit; 231 unsigned long addr; 232 struct sdw_dpn_prop *dpn; 233 234 sdw_slave_read_prop(slave); 235 prop->scp_int1_mask = SDW_SCP_INT1_BUS_CLASH | SDW_SCP_INT1_PARITY; 236 prop->quirks = SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY; 237 238 prop->paging_support = true; 239 240 /* 241 * port = 1 for headphone playback 242 * port = 2 for headset-mic capture 243 * port = 3 for speaker playback 244 * port = 6 for digital-mic capture 245 */ 246 prop->source_ports = BIT(6) | BIT(2); /* BITMAP: 01000100 */ 247 prop->sink_ports = BIT(3) | BIT(1); /* BITMAP: 00001010 */ 248 249 nval = hweight32(prop->source_ports); 250 prop->src_dpn_prop = devm_kcalloc(&slave->dev, nval, 251 sizeof(*prop->src_dpn_prop), GFP_KERNEL); 252 if (!prop->src_dpn_prop) 253 return -ENOMEM; 254 255 i = 0; 256 dpn = prop->src_dpn_prop; 257 addr = prop->source_ports; 258 for_each_set_bit(bit, &addr, 32) { 259 dpn[i].num = bit; 260 dpn[i].type = SDW_DPN_FULL; 261 dpn[i].simple_ch_prep_sm = true; 262 dpn[i].ch_prep_timeout = 10; 263 i++; 264 } 265 266 /* do this again for sink now */ 267 nval = hweight32(prop->sink_ports); 268 prop->sink_dpn_prop = devm_kcalloc(&slave->dev, nval, 269 sizeof(*prop->sink_dpn_prop), GFP_KERNEL); 270 if (!prop->sink_dpn_prop) 271 return -ENOMEM; 272 273 j = 0; 274 dpn = prop->sink_dpn_prop; 275 addr = prop->sink_ports; 276 for_each_set_bit(bit, &addr, 32) { 277 dpn[j].num = bit; 278 dpn[j].type = SDW_DPN_FULL; 279 dpn[j].simple_ch_prep_sm = true; 280 dpn[j].ch_prep_timeout = 10; 281 j++; 282 } 283 284 /* set the timeout values */ 285 prop->clk_stop_timeout = 1380; 286 287 /* wake-up event */ 288 prop->wake_capable = 1; 289 290 /* Three data lanes are supported by rt721-sdca codec */ 291 prop->lane_control_support = true; 292 293 return 0; 294 } 295 296 static int rt721_sdca_interrupt_callback(struct sdw_slave *slave, 297 struct sdw_slave_intr_status *status) 298 { 299 struct rt721_sdca_priv *rt721 = dev_get_drvdata(&slave->dev); 300 int ret, stat; 301 int count = 0, retry = 3; 302 unsigned int sdca_cascade, scp_sdca_stat1, scp_sdca_stat2 = 0; 303 304 if (cancel_delayed_work_sync(&rt721->jack_detect_work)) { 305 dev_warn(&slave->dev, "%s the pending delayed_work was cancelled", __func__); 306 /* avoid the HID owner doesn't change to device */ 307 if (rt721->scp_sdca_stat2) 308 scp_sdca_stat2 = rt721->scp_sdca_stat2; 309 } 310 311 /* 312 * The critical section below intentionally protects a rather large piece of code. 313 * We don't want to allow the system suspend to disable an interrupt while we are 314 * processing it, which could be problematic given the quirky SoundWire interrupt 315 * scheme. We do want however to prevent new workqueues from being scheduled if 316 * the disable_irq flag was set during system suspend. 317 */ 318 mutex_lock(&rt721->disable_irq_lock); 319 320 ret = sdw_read_no_pm(rt721->slave, SDW_SCP_SDCA_INT1); 321 if (ret < 0) 322 goto io_error; 323 324 rt721->scp_sdca_stat1 = ret; 325 ret = sdw_read_no_pm(rt721->slave, SDW_SCP_SDCA_INT2); 326 if (ret < 0) 327 goto io_error; 328 329 rt721->scp_sdca_stat2 = ret; 330 if (scp_sdca_stat2) 331 rt721->scp_sdca_stat2 |= scp_sdca_stat2; 332 do { 333 /* clear flag */ 334 ret = sdw_read_no_pm(rt721->slave, SDW_SCP_SDCA_INT1); 335 if (ret < 0) 336 goto io_error; 337 if (ret & SDW_SCP_SDCA_INTMASK_SDCA_0) { 338 ret = sdw_update_no_pm(rt721->slave, SDW_SCP_SDCA_INT1, 339 SDW_SCP_SDCA_INT_SDCA_0, SDW_SCP_SDCA_INT_SDCA_0); 340 if (ret < 0) 341 goto io_error; 342 } 343 ret = sdw_read_no_pm(rt721->slave, SDW_SCP_SDCA_INT2); 344 if (ret < 0) 345 goto io_error; 346 if (ret & SDW_SCP_SDCA_INTMASK_SDCA_8) { 347 ret = sdw_write_no_pm(rt721->slave, SDW_SCP_SDCA_INT2, 348 SDW_SCP_SDCA_INTMASK_SDCA_8); 349 if (ret < 0) 350 goto io_error; 351 } 352 353 /* check if flag clear or not */ 354 ret = sdw_read_no_pm(rt721->slave, SDW_DP0_INT); 355 if (ret < 0) 356 goto io_error; 357 sdca_cascade = ret & SDW_DP0_SDCA_CASCADE; 358 359 ret = sdw_read_no_pm(rt721->slave, SDW_SCP_SDCA_INT1); 360 if (ret < 0) 361 goto io_error; 362 scp_sdca_stat1 = ret & SDW_SCP_SDCA_INTMASK_SDCA_0; 363 364 ret = sdw_read_no_pm(rt721->slave, SDW_SCP_SDCA_INT2); 365 if (ret < 0) 366 goto io_error; 367 scp_sdca_stat2 = ret & SDW_SCP_SDCA_INTMASK_SDCA_8; 368 369 stat = scp_sdca_stat1 || scp_sdca_stat2 || sdca_cascade; 370 371 count++; 372 } while (stat != 0 && count < retry); 373 374 if (stat) 375 dev_warn(&slave->dev, 376 "%s scp_sdca_stat1=0x%x, scp_sdca_stat2=0x%x\n", __func__, 377 rt721->scp_sdca_stat1, rt721->scp_sdca_stat2); 378 ret = sdw_read_no_pm(rt721->slave, SDW_SCP_SDCA_INT1); 379 ret = sdw_read_no_pm(rt721->slave, SDW_SCP_SDCA_INT2); 380 381 if (status->sdca_cascade && !rt721->disable_irq) 382 mod_delayed_work(system_power_efficient_wq, 383 &rt721->jack_detect_work, msecs_to_jiffies(280)); 384 385 mutex_unlock(&rt721->disable_irq_lock); 386 387 return 0; 388 389 io_error: 390 mutex_unlock(&rt721->disable_irq_lock); 391 pr_err_ratelimited("IO error in %s, ret %d\n", __func__, ret); 392 return ret; 393 } 394 395 static const struct sdw_slave_ops rt721_sdca_slave_ops = { 396 .read_prop = rt721_sdca_read_prop, 397 .interrupt_callback = rt721_sdca_interrupt_callback, 398 .update_status = rt721_sdca_update_status, 399 }; 400 401 static int rt721_sdca_sdw_probe(struct sdw_slave *slave, 402 const struct sdw_device_id *id) 403 { 404 struct regmap *regmap, *mbq_regmap; 405 406 /* Regmap Initialization */ 407 mbq_regmap = devm_regmap_init_sdw_mbq(slave, &rt721_sdca_mbq_regmap); 408 if (IS_ERR(mbq_regmap)) 409 return PTR_ERR(mbq_regmap); 410 411 regmap = devm_regmap_init_sdw(slave, &rt721_sdca_regmap); 412 if (IS_ERR(regmap)) 413 return PTR_ERR(regmap); 414 415 return rt721_sdca_init(&slave->dev, regmap, mbq_regmap, slave); 416 } 417 418 static int rt721_sdca_sdw_remove(struct sdw_slave *slave) 419 { 420 struct rt721_sdca_priv *rt721 = dev_get_drvdata(&slave->dev); 421 422 if (rt721->hw_init) { 423 cancel_delayed_work_sync(&rt721->jack_detect_work); 424 cancel_delayed_work_sync(&rt721->jack_btn_check_work); 425 } 426 427 if (rt721->first_hw_init) 428 pm_runtime_disable(&slave->dev); 429 430 mutex_destroy(&rt721->calibrate_mutex); 431 mutex_destroy(&rt721->disable_irq_lock); 432 433 return 0; 434 } 435 436 static const struct sdw_device_id rt721_sdca_id[] = { 437 SDW_SLAVE_ENTRY_EXT(0x025d, 0x721, 0x3, 0x1, 0), 438 {}, 439 }; 440 MODULE_DEVICE_TABLE(sdw, rt721_sdca_id); 441 442 static int rt721_sdca_dev_suspend(struct device *dev) 443 { 444 struct rt721_sdca_priv *rt721 = dev_get_drvdata(dev); 445 446 if (!rt721->hw_init) 447 return 0; 448 449 cancel_delayed_work_sync(&rt721->jack_detect_work); 450 cancel_delayed_work_sync(&rt721->jack_btn_check_work); 451 452 regcache_cache_only(rt721->regmap, true); 453 regcache_cache_only(rt721->mbq_regmap, true); 454 455 return 0; 456 } 457 458 static int rt721_sdca_dev_system_suspend(struct device *dev) 459 { 460 struct rt721_sdca_priv *rt721_sdca = dev_get_drvdata(dev); 461 struct sdw_slave *slave = dev_to_sdw_dev(dev); 462 int ret1, ret2; 463 464 if (!rt721_sdca->hw_init) 465 return 0; 466 467 /* 468 * prevent new interrupts from being handled after the 469 * deferred work completes and before the parent disables 470 * interrupts on the link 471 */ 472 mutex_lock(&rt721_sdca->disable_irq_lock); 473 rt721_sdca->disable_irq = true; 474 ret1 = sdw_update_no_pm(slave, SDW_SCP_SDCA_INTMASK1, 475 SDW_SCP_SDCA_INTMASK_SDCA_0, 0); 476 ret2 = sdw_update_no_pm(slave, SDW_SCP_SDCA_INTMASK2, 477 SDW_SCP_SDCA_INTMASK_SDCA_8, 0); 478 mutex_unlock(&rt721_sdca->disable_irq_lock); 479 480 if (ret1 < 0 || ret2 < 0) { 481 /* log but don't prevent suspend from happening */ 482 dev_dbg(&slave->dev, "%s: could not disable SDCA interrupts\n:", __func__); 483 } 484 485 return rt721_sdca_dev_suspend(dev); 486 } 487 488 #define RT721_PROBE_TIMEOUT 5000 489 490 static int rt721_sdca_dev_resume(struct device *dev) 491 { 492 struct sdw_slave *slave = dev_to_sdw_dev(dev); 493 struct rt721_sdca_priv *rt721 = dev_get_drvdata(dev); 494 unsigned long time; 495 496 if (!rt721->first_hw_init) 497 return 0; 498 499 if (!slave->unattach_request) { 500 mutex_lock(&rt721->disable_irq_lock); 501 if (rt721->disable_irq == true) { 502 sdw_write_no_pm(slave, SDW_SCP_SDCA_INTMASK1, SDW_SCP_SDCA_INTMASK_SDCA_0); 503 sdw_write_no_pm(slave, SDW_SCP_SDCA_INTMASK2, SDW_SCP_SDCA_INTMASK_SDCA_8); 504 rt721->disable_irq = false; 505 } 506 mutex_unlock(&rt721->disable_irq_lock); 507 goto regmap_sync; 508 } 509 510 time = wait_for_completion_timeout(&slave->initialization_complete, 511 msecs_to_jiffies(RT721_PROBE_TIMEOUT)); 512 if (!time) { 513 dev_err(&slave->dev, "Initialization not complete, timed out\n"); 514 sdw_show_ping_status(slave->bus, true); 515 516 return -ETIMEDOUT; 517 } 518 519 regmap_sync: 520 slave->unattach_request = 0; 521 regcache_cache_only(rt721->regmap, false); 522 regcache_sync(rt721->regmap); 523 regcache_cache_only(rt721->mbq_regmap, false); 524 regcache_sync(rt721->mbq_regmap); 525 return 0; 526 } 527 528 static const struct dev_pm_ops rt721_sdca_pm = { 529 SYSTEM_SLEEP_PM_OPS(rt721_sdca_dev_system_suspend, rt721_sdca_dev_resume) 530 RUNTIME_PM_OPS(rt721_sdca_dev_suspend, rt721_sdca_dev_resume, NULL) 531 }; 532 533 static struct sdw_driver rt721_sdca_sdw_driver = { 534 .driver = { 535 .name = "rt721-sdca", 536 .owner = THIS_MODULE, 537 .pm = pm_ptr(&rt721_sdca_pm), 538 }, 539 .probe = rt721_sdca_sdw_probe, 540 .remove = rt721_sdca_sdw_remove, 541 .ops = &rt721_sdca_slave_ops, 542 .id_table = rt721_sdca_id, 543 }; 544 module_sdw_driver(rt721_sdca_sdw_driver); 545 546 MODULE_DESCRIPTION("ASoC RT721 SDCA SDW driver"); 547 MODULE_AUTHOR("Jack Yu <jack.yu@realtek.com>"); 548 MODULE_LICENSE("GPL"); 549