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