0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/delay.h>
0010 #include <linux/device.h>
0011 #include <linux/mod_devicetable.h>
0012 #include <linux/soundwire/sdw.h>
0013 #include <linux/soundwire/sdw_type.h>
0014 #include <linux/soundwire/sdw_registers.h>
0015 #include <linux/module.h>
0016 #include <linux/pm_runtime.h>
0017 #include <linux/regmap.h>
0018 #include <sound/soc.h>
0019 #include "rt711.h"
0020 #include "rt711-sdw.h"
0021
0022 static bool rt711_readable_register(struct device *dev, unsigned int reg)
0023 {
0024 switch (reg) {
0025 case 0x00e0:
0026 case 0x00f0:
0027 case 0x2012 ... 0x2016:
0028 case 0x201a ... 0x2027:
0029 case 0x2029 ... 0x202a:
0030 case 0x202d ... 0x2034:
0031 case 0x2201 ... 0x2204:
0032 case 0x2206 ... 0x2212:
0033 case 0x2220 ... 0x2223:
0034 case 0x2230 ... 0x2239:
0035 case 0x2f01 ... 0x2f0f:
0036 case 0x3000 ... 0x3fff:
0037 case 0x7000 ... 0x7fff:
0038 case 0x8300 ... 0x83ff:
0039 case 0x9c00 ... 0x9cff:
0040 case 0xb900 ... 0xb9ff:
0041 case 0x752009:
0042 case 0x752011:
0043 case 0x75201a:
0044 case 0x752045:
0045 case 0x752046:
0046 case 0x752048:
0047 case 0x75204a:
0048 case 0x75206b:
0049 case 0x75206f:
0050 case 0x752080:
0051 case 0x752081:
0052 case 0x752091:
0053 case 0x755800:
0054 return true;
0055 default:
0056 return false;
0057 }
0058 }
0059
0060 static bool rt711_volatile_register(struct device *dev, unsigned int reg)
0061 {
0062 switch (reg) {
0063 case 0x2016:
0064 case 0x201b:
0065 case 0x201c:
0066 case 0x201d:
0067 case 0x201f:
0068 case 0x2021:
0069 case 0x2023:
0070 case 0x2230:
0071 case 0x2012 ... 0x2015:
0072 case 0x202d ... 0x202f:
0073 case 0x2201 ... 0x2212:
0074 case 0x2220 ... 0x2223:
0075 case 0x9c00 ... 0x9cff:
0076 case 0xb900 ... 0xb9ff:
0077 case 0xff01:
0078 case 0x75201a:
0079 case 0x752046:
0080 case 0x752080:
0081 case 0x752081:
0082 case 0x755800:
0083 return true;
0084 default:
0085 return false;
0086 }
0087 }
0088
0089 static int rt711_sdw_read(void *context, unsigned int reg, unsigned int *val)
0090 {
0091 struct device *dev = context;
0092 struct rt711_priv *rt711 = dev_get_drvdata(dev);
0093 unsigned int sdw_data_3, sdw_data_2, sdw_data_1, sdw_data_0;
0094 unsigned int reg2 = 0, reg3 = 0, reg4 = 0, mask, nid, val2;
0095 unsigned int is_hda_reg = 1, is_index_reg = 0;
0096 int ret;
0097
0098 if (reg > 0xffff)
0099 is_index_reg = 1;
0100
0101 mask = reg & 0xf000;
0102
0103 if (is_index_reg) {
0104 val2 = reg & 0xff;
0105 reg = reg >> 8;
0106 nid = reg & 0xff;
0107 ret = regmap_write(rt711->sdw_regmap, reg, 0);
0108 if (ret < 0)
0109 return ret;
0110 reg2 = reg + 0x1000;
0111 reg2 |= 0x80;
0112 ret = regmap_write(rt711->sdw_regmap, reg2, val2);
0113 if (ret < 0)
0114 return ret;
0115
0116 reg3 = RT711_PRIV_DATA_R_H | nid;
0117 ret = regmap_write(rt711->sdw_regmap,
0118 reg3, ((*val >> 8) & 0xff));
0119 if (ret < 0)
0120 return ret;
0121 reg4 = reg3 + 0x1000;
0122 reg4 |= 0x80;
0123 ret = regmap_write(rt711->sdw_regmap, reg4, (*val & 0xff));
0124 if (ret < 0)
0125 return ret;
0126 } else if (mask == 0x3000) {
0127 reg += 0x8000;
0128 ret = regmap_write(rt711->sdw_regmap, reg, *val);
0129 if (ret < 0)
0130 return ret;
0131 } else if (mask == 0x7000) {
0132 reg += 0x2000;
0133 reg |= 0x800;
0134 ret = regmap_write(rt711->sdw_regmap,
0135 reg, ((*val >> 8) & 0xff));
0136 if (ret < 0)
0137 return ret;
0138 reg2 = reg + 0x1000;
0139 reg2 |= 0x80;
0140 ret = regmap_write(rt711->sdw_regmap, reg2, (*val & 0xff));
0141 if (ret < 0)
0142 return ret;
0143 } else if ((reg & 0xff00) == 0x8300) {
0144 reg2 = reg - 0x1000;
0145 reg2 &= ~0x80;
0146 ret = regmap_write(rt711->sdw_regmap,
0147 reg2, ((*val >> 8) & 0xff));
0148 if (ret < 0)
0149 return ret;
0150 ret = regmap_write(rt711->sdw_regmap, reg, (*val & 0xff));
0151 if (ret < 0)
0152 return ret;
0153 } else if (mask == 0x9000) {
0154 ret = regmap_write(rt711->sdw_regmap,
0155 reg, ((*val >> 8) & 0xff));
0156 if (ret < 0)
0157 return ret;
0158 reg2 = reg + 0x1000;
0159 reg2 |= 0x80;
0160 ret = regmap_write(rt711->sdw_regmap, reg2, (*val & 0xff));
0161 if (ret < 0)
0162 return ret;
0163 } else if (mask == 0xb000) {
0164 ret = regmap_write(rt711->sdw_regmap, reg, *val);
0165 if (ret < 0)
0166 return ret;
0167 } else {
0168 ret = regmap_read(rt711->sdw_regmap, reg, val);
0169 if (ret < 0)
0170 return ret;
0171 is_hda_reg = 0;
0172 }
0173
0174 if (is_hda_reg || is_index_reg) {
0175 sdw_data_3 = 0;
0176 sdw_data_2 = 0;
0177 sdw_data_1 = 0;
0178 sdw_data_0 = 0;
0179 ret = regmap_read(rt711->sdw_regmap,
0180 RT711_READ_HDA_3, &sdw_data_3);
0181 if (ret < 0)
0182 return ret;
0183 ret = regmap_read(rt711->sdw_regmap,
0184 RT711_READ_HDA_2, &sdw_data_2);
0185 if (ret < 0)
0186 return ret;
0187 ret = regmap_read(rt711->sdw_regmap,
0188 RT711_READ_HDA_1, &sdw_data_1);
0189 if (ret < 0)
0190 return ret;
0191 ret = regmap_read(rt711->sdw_regmap,
0192 RT711_READ_HDA_0, &sdw_data_0);
0193 if (ret < 0)
0194 return ret;
0195 *val = ((sdw_data_3 & 0xff) << 24) |
0196 ((sdw_data_2 & 0xff) << 16) |
0197 ((sdw_data_1 & 0xff) << 8) | (sdw_data_0 & 0xff);
0198 }
0199
0200 if (is_hda_reg == 0)
0201 dev_dbg(dev, "[%s] %04x => %08x\n", __func__, reg, *val);
0202 else if (is_index_reg)
0203 dev_dbg(dev, "[%s] %04x %04x %04x %04x => %08x\n",
0204 __func__, reg, reg2, reg3, reg4, *val);
0205 else
0206 dev_dbg(dev, "[%s] %04x %04x => %08x\n",
0207 __func__, reg, reg2, *val);
0208
0209 return 0;
0210 }
0211
0212 static int rt711_sdw_write(void *context, unsigned int reg, unsigned int val)
0213 {
0214 struct device *dev = context;
0215 struct rt711_priv *rt711 = dev_get_drvdata(dev);
0216 unsigned int reg2 = 0, reg3, reg4, nid, mask, val2;
0217 unsigned int is_index_reg = 0;
0218 int ret;
0219
0220 if (reg > 0xffff)
0221 is_index_reg = 1;
0222
0223 mask = reg & 0xf000;
0224
0225 if (is_index_reg) {
0226 val2 = reg & 0xff;
0227 reg = reg >> 8;
0228 nid = reg & 0xff;
0229 ret = regmap_write(rt711->sdw_regmap, reg, 0);
0230 if (ret < 0)
0231 return ret;
0232 reg2 = reg + 0x1000;
0233 reg2 |= 0x80;
0234 ret = regmap_write(rt711->sdw_regmap, reg2, val2);
0235 if (ret < 0)
0236 return ret;
0237
0238 reg3 = RT711_PRIV_DATA_W_H | nid;
0239 ret = regmap_write(rt711->sdw_regmap,
0240 reg3, ((val >> 8) & 0xff));
0241 if (ret < 0)
0242 return ret;
0243 reg4 = reg3 + 0x1000;
0244 reg4 |= 0x80;
0245 ret = regmap_write(rt711->sdw_regmap, reg4, (val & 0xff));
0246 if (ret < 0)
0247 return ret;
0248 is_index_reg = 1;
0249 } else if (reg < 0x4fff) {
0250 ret = regmap_write(rt711->sdw_regmap, reg, val);
0251 if (ret < 0)
0252 return ret;
0253 } else if (reg == RT711_FUNC_RESET) {
0254 ret = regmap_write(rt711->sdw_regmap, reg, val);
0255 if (ret < 0)
0256 return ret;
0257 } else if (mask == 0x7000) {
0258 ret = regmap_write(rt711->sdw_regmap,
0259 reg, ((val >> 8) & 0xff));
0260 if (ret < 0)
0261 return ret;
0262 reg2 = reg + 0x1000;
0263 reg2 |= 0x80;
0264 ret = regmap_write(rt711->sdw_regmap, reg2, (val & 0xff));
0265 if (ret < 0)
0266 return ret;
0267 } else if ((reg & 0xff00) == 0x8300) {
0268 reg2 = reg - 0x1000;
0269 reg2 &= ~0x80;
0270 ret = regmap_write(rt711->sdw_regmap,
0271 reg2, ((val >> 8) & 0xff));
0272 if (ret < 0)
0273 return ret;
0274 ret = regmap_write(rt711->sdw_regmap, reg, (val & 0xff));
0275 if (ret < 0)
0276 return ret;
0277 }
0278
0279 if (reg2 == 0)
0280 dev_dbg(dev, "[%s] %04x <= %04x\n", __func__, reg, val);
0281 else if (is_index_reg)
0282 dev_dbg(dev, "[%s] %04x %04x %04x %04x <= %04x %04x\n",
0283 __func__, reg, reg2, reg3, reg4, val2, val);
0284 else
0285 dev_dbg(dev, "[%s] %04x %04x <= %04x\n",
0286 __func__, reg, reg2, val);
0287
0288 return 0;
0289 }
0290
0291 static const struct regmap_config rt711_regmap = {
0292 .reg_bits = 24,
0293 .val_bits = 32,
0294 .readable_reg = rt711_readable_register,
0295 .volatile_reg = rt711_volatile_register,
0296 .max_register = 0x755800,
0297 .reg_defaults = rt711_reg_defaults,
0298 .num_reg_defaults = ARRAY_SIZE(rt711_reg_defaults),
0299 .cache_type = REGCACHE_RBTREE,
0300 .use_single_read = true,
0301 .use_single_write = true,
0302 .reg_read = rt711_sdw_read,
0303 .reg_write = rt711_sdw_write,
0304 };
0305
0306 static const struct regmap_config rt711_sdw_regmap = {
0307 .name = "sdw",
0308 .reg_bits = 32,
0309 .val_bits = 8,
0310 .readable_reg = rt711_readable_register,
0311 .max_register = 0xff01,
0312 .cache_type = REGCACHE_NONE,
0313 .use_single_read = true,
0314 .use_single_write = true,
0315 };
0316
0317 static int rt711_update_status(struct sdw_slave *slave,
0318 enum sdw_slave_status status)
0319 {
0320 struct rt711_priv *rt711 = dev_get_drvdata(&slave->dev);
0321
0322
0323 rt711->status = status;
0324
0325 if (status == SDW_SLAVE_UNATTACHED)
0326 rt711->hw_init = false;
0327
0328
0329
0330
0331
0332 if (rt711->hw_init || rt711->status != SDW_SLAVE_ATTACHED)
0333 return 0;
0334
0335
0336 return rt711_io_init(&slave->dev, slave);
0337 }
0338
0339 static int rt711_read_prop(struct sdw_slave *slave)
0340 {
0341 struct sdw_slave_prop *prop = &slave->prop;
0342 int nval;
0343 int i, j;
0344 u32 bit;
0345 unsigned long addr;
0346 struct sdw_dpn_prop *dpn;
0347
0348 prop->scp_int1_mask = SDW_SCP_INT1_IMPL_DEF | SDW_SCP_INT1_BUS_CLASH |
0349 SDW_SCP_INT1_PARITY;
0350 prop->quirks = SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY;
0351
0352 prop->paging_support = false;
0353
0354
0355 prop->source_ports = 0x14;
0356 prop->sink_ports = 0x8;
0357
0358 nval = hweight32(prop->source_ports);
0359 prop->src_dpn_prop = devm_kcalloc(&slave->dev, nval,
0360 sizeof(*prop->src_dpn_prop),
0361 GFP_KERNEL);
0362 if (!prop->src_dpn_prop)
0363 return -ENOMEM;
0364
0365 i = 0;
0366 dpn = prop->src_dpn_prop;
0367 addr = prop->source_ports;
0368 for_each_set_bit(bit, &addr, 32) {
0369 dpn[i].num = bit;
0370 dpn[i].type = SDW_DPN_FULL;
0371 dpn[i].simple_ch_prep_sm = true;
0372 dpn[i].ch_prep_timeout = 10;
0373 i++;
0374 }
0375
0376
0377 nval = hweight32(prop->sink_ports);
0378 prop->sink_dpn_prop = devm_kcalloc(&slave->dev, nval,
0379 sizeof(*prop->sink_dpn_prop),
0380 GFP_KERNEL);
0381 if (!prop->sink_dpn_prop)
0382 return -ENOMEM;
0383
0384 j = 0;
0385 dpn = prop->sink_dpn_prop;
0386 addr = prop->sink_ports;
0387 for_each_set_bit(bit, &addr, 32) {
0388 dpn[j].num = bit;
0389 dpn[j].type = SDW_DPN_FULL;
0390 dpn[j].simple_ch_prep_sm = true;
0391 dpn[j].ch_prep_timeout = 10;
0392 j++;
0393 }
0394
0395
0396 prop->clk_stop_timeout = 20;
0397
0398
0399 prop->wake_capable = 1;
0400
0401 return 0;
0402 }
0403
0404 static int rt711_bus_config(struct sdw_slave *slave,
0405 struct sdw_bus_params *params)
0406 {
0407 struct rt711_priv *rt711 = dev_get_drvdata(&slave->dev);
0408 int ret;
0409
0410 memcpy(&rt711->params, params, sizeof(*params));
0411
0412 ret = rt711_clock_config(&slave->dev);
0413 if (ret < 0)
0414 dev_err(&slave->dev, "Invalid clk config");
0415
0416 return ret;
0417 }
0418
0419 static int rt711_interrupt_callback(struct sdw_slave *slave,
0420 struct sdw_slave_intr_status *status)
0421 {
0422 struct rt711_priv *rt711 = dev_get_drvdata(&slave->dev);
0423
0424 dev_dbg(&slave->dev,
0425 "%s control_port_stat=%x", __func__, status->control_port);
0426
0427 mutex_lock(&rt711->disable_irq_lock);
0428 if (status->control_port & 0x4 && !rt711->disable_irq) {
0429 mod_delayed_work(system_power_efficient_wq,
0430 &rt711->jack_detect_work, msecs_to_jiffies(250));
0431 }
0432 mutex_unlock(&rt711->disable_irq_lock);
0433
0434 return 0;
0435 }
0436
0437 static const struct sdw_slave_ops rt711_slave_ops = {
0438 .read_prop = rt711_read_prop,
0439 .interrupt_callback = rt711_interrupt_callback,
0440 .update_status = rt711_update_status,
0441 .bus_config = rt711_bus_config,
0442 };
0443
0444 static int rt711_sdw_probe(struct sdw_slave *slave,
0445 const struct sdw_device_id *id)
0446 {
0447 struct regmap *sdw_regmap, *regmap;
0448
0449
0450 sdw_regmap = devm_regmap_init_sdw(slave, &rt711_sdw_regmap);
0451 if (IS_ERR(sdw_regmap))
0452 return PTR_ERR(sdw_regmap);
0453
0454 regmap = devm_regmap_init(&slave->dev, NULL,
0455 &slave->dev, &rt711_regmap);
0456 if (IS_ERR(regmap))
0457 return PTR_ERR(regmap);
0458
0459 rt711_init(&slave->dev, sdw_regmap, regmap, slave);
0460
0461 return 0;
0462 }
0463
0464 static int rt711_sdw_remove(struct sdw_slave *slave)
0465 {
0466 struct rt711_priv *rt711 = dev_get_drvdata(&slave->dev);
0467
0468 if (rt711->hw_init) {
0469 cancel_delayed_work_sync(&rt711->jack_detect_work);
0470 cancel_delayed_work_sync(&rt711->jack_btn_check_work);
0471 cancel_work_sync(&rt711->calibration_work);
0472 }
0473
0474 if (rt711->first_hw_init)
0475 pm_runtime_disable(&slave->dev);
0476
0477 mutex_destroy(&rt711->calibrate_mutex);
0478 mutex_destroy(&rt711->disable_irq_lock);
0479
0480 return 0;
0481 }
0482
0483 static const struct sdw_device_id rt711_id[] = {
0484 SDW_SLAVE_ENTRY_EXT(0x025d, 0x711, 0x2, 0, 0),
0485 {},
0486 };
0487 MODULE_DEVICE_TABLE(sdw, rt711_id);
0488
0489 static int __maybe_unused rt711_dev_suspend(struct device *dev)
0490 {
0491 struct rt711_priv *rt711 = dev_get_drvdata(dev);
0492
0493 if (!rt711->hw_init)
0494 return 0;
0495
0496 cancel_delayed_work_sync(&rt711->jack_detect_work);
0497 cancel_delayed_work_sync(&rt711->jack_btn_check_work);
0498 cancel_work_sync(&rt711->calibration_work);
0499
0500 regcache_cache_only(rt711->regmap, true);
0501
0502 return 0;
0503 }
0504
0505 static int __maybe_unused rt711_dev_system_suspend(struct device *dev)
0506 {
0507 struct rt711_priv *rt711 = dev_get_drvdata(dev);
0508 struct sdw_slave *slave = dev_to_sdw_dev(dev);
0509 int ret;
0510
0511 if (!rt711->hw_init)
0512 return 0;
0513
0514
0515
0516
0517
0518
0519 mutex_lock(&rt711->disable_irq_lock);
0520 rt711->disable_irq = true;
0521 ret = sdw_update_no_pm(slave, SDW_SCP_INTMASK1,
0522 SDW_SCP_INT1_IMPL_DEF, 0);
0523 mutex_unlock(&rt711->disable_irq_lock);
0524
0525 if (ret < 0) {
0526
0527 dev_dbg(&slave->dev, "%s: could not disable imp-def interrupts\n:", __func__);
0528 }
0529
0530 return rt711_dev_suspend(dev);
0531 }
0532
0533 #define RT711_PROBE_TIMEOUT 5000
0534
0535 static int __maybe_unused rt711_dev_resume(struct device *dev)
0536 {
0537 struct sdw_slave *slave = dev_to_sdw_dev(dev);
0538 struct rt711_priv *rt711 = dev_get_drvdata(dev);
0539 unsigned long time;
0540
0541 if (!rt711->first_hw_init)
0542 return 0;
0543
0544 if (!slave->unattach_request)
0545 goto regmap_sync;
0546
0547 time = wait_for_completion_timeout(&slave->initialization_complete,
0548 msecs_to_jiffies(RT711_PROBE_TIMEOUT));
0549 if (!time) {
0550 dev_err(&slave->dev, "Initialization not complete, timed out\n");
0551 return -ETIMEDOUT;
0552 }
0553
0554 regmap_sync:
0555 slave->unattach_request = 0;
0556 regcache_cache_only(rt711->regmap, false);
0557 regcache_sync_region(rt711->regmap, 0x3000, 0x8fff);
0558 regcache_sync_region(rt711->regmap, 0x752009, 0x752091);
0559
0560 return 0;
0561 }
0562
0563 static const struct dev_pm_ops rt711_pm = {
0564 SET_SYSTEM_SLEEP_PM_OPS(rt711_dev_system_suspend, rt711_dev_resume)
0565 SET_RUNTIME_PM_OPS(rt711_dev_suspend, rt711_dev_resume, NULL)
0566 };
0567
0568 static struct sdw_driver rt711_sdw_driver = {
0569 .driver = {
0570 .name = "rt711",
0571 .owner = THIS_MODULE,
0572 .pm = &rt711_pm,
0573 },
0574 .probe = rt711_sdw_probe,
0575 .remove = rt711_sdw_remove,
0576 .ops = &rt711_slave_ops,
0577 .id_table = rt711_id,
0578 };
0579 module_sdw_driver(rt711_sdw_driver);
0580
0581 MODULE_DESCRIPTION("ASoC RT711 SDW driver");
0582 MODULE_AUTHOR("Shuming Fan <shumingf@realtek.com>");
0583 MODULE_LICENSE("GPL");