Lines Matching +full:slave +full:- +full:if
1 // SPDX-License-Identifier: GPL-2.0
3 // rt700-sdw.c -- rt700 ALSA SoC audio driver
20 #include "rt700-sdw.h"
68 case 0x2012 ... 0x2015: /* HD-A read */
71 case 0x2220 ... 0x2223: /* decoded HD-A */
94 if (reg > 0xffff)
99 if (is_index_reg) { /* index registers */
103 ret = regmap_write(rt700->sdw_regmap, reg, 0);
104 if (ret < 0)
108 ret = regmap_write(rt700->sdw_regmap, reg2, val2);
109 if (ret < 0)
113 ret = regmap_write(rt700->sdw_regmap,
115 if (ret < 0)
119 ret = regmap_write(rt700->sdw_regmap, reg4, (*val & 0xff));
120 if (ret < 0)
122 } else if (mask == 0x3000) {
124 ret = regmap_write(rt700->sdw_regmap, reg, *val);
125 if (ret < 0)
127 } else if (mask == 0x7000) {
130 ret = regmap_write(rt700->sdw_regmap,
132 if (ret < 0)
136 ret = regmap_write(rt700->sdw_regmap, reg2, (*val & 0xff));
137 if (ret < 0)
139 } else if ((reg & 0xff00) == 0x8300) { /* for R channel */
140 reg2 = reg - 0x1000;
142 ret = regmap_write(rt700->sdw_regmap,
144 if (ret < 0)
146 ret = regmap_write(rt700->sdw_regmap, reg, (*val & 0xff));
147 if (ret < 0)
149 } else if (mask == 0x9000) {
150 ret = regmap_write(rt700->sdw_regmap,
152 if (ret < 0)
156 ret = regmap_write(rt700->sdw_regmap, reg2, (*val & 0xff));
157 if (ret < 0)
159 } else if (mask == 0xb000) {
160 ret = regmap_write(rt700->sdw_regmap, reg, *val);
161 if (ret < 0)
164 ret = regmap_read(rt700->sdw_regmap, reg, val);
165 if (ret < 0)
170 if (is_hda_reg || is_index_reg) {
175 ret = regmap_read(rt700->sdw_regmap,
177 if (ret < 0)
179 ret = regmap_read(rt700->sdw_regmap,
181 if (ret < 0)
183 ret = regmap_read(rt700->sdw_regmap,
185 if (ret < 0)
187 ret = regmap_read(rt700->sdw_regmap,
189 if (ret < 0)
196 if (is_hda_reg == 0)
198 else if (is_index_reg)
216 if (reg > 0xffff)
221 if (is_index_reg) { /* index registers */
225 ret = regmap_write(rt700->sdw_regmap, reg, 0);
226 if (ret < 0)
230 ret = regmap_write(rt700->sdw_regmap, reg2, val2);
231 if (ret < 0)
235 ret = regmap_write(rt700->sdw_regmap,
237 if (ret < 0)
241 ret = regmap_write(rt700->sdw_regmap, reg4, (val & 0xff));
242 if (ret < 0)
245 } else if (reg < 0x4fff) {
246 ret = regmap_write(rt700->sdw_regmap, reg, val);
247 if (ret < 0)
249 } else if (reg == 0xff01) {
250 ret = regmap_write(rt700->sdw_regmap, reg, val);
251 if (ret < 0)
253 } else if (mask == 0x7000) {
254 ret = regmap_write(rt700->sdw_regmap,
256 if (ret < 0)
260 ret = regmap_write(rt700->sdw_regmap, reg2, (val & 0xff));
261 if (ret < 0)
263 } else if ((reg & 0xff00) == 0x8300) { /* for R channel */
264 reg2 = reg - 0x1000;
266 ret = regmap_write(rt700->sdw_regmap,
268 if (ret < 0)
270 ret = regmap_write(rt700->sdw_regmap, reg, (val & 0xff));
271 if (ret < 0)
275 if (reg2 == 0)
277 else if (is_index_reg)
313 static int rt700_update_status(struct sdw_slave *slave,
316 struct rt700_priv *rt700 = dev_get_drvdata(&slave->dev);
318 if (status == SDW_SLAVE_UNATTACHED)
319 rt700->hw_init = false;
322 * Perform initialization only if slave status is present and
325 if (rt700->hw_init || status != SDW_SLAVE_ATTACHED)
328 /* perform I/O transfers required for Slave initialization */
329 return rt700_io_init(&slave->dev, slave);
332 static int rt700_read_prop(struct sdw_slave *slave)
334 struct sdw_slave_prop *prop = &slave->prop;
340 prop->scp_int1_mask = SDW_SCP_INT1_IMPL_DEF | SDW_SCP_INT1_BUS_CLASH |
342 prop->quirks = SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY;
344 prop->paging_support = false;
347 prop->source_ports = 0x14; /* BITMAP: 00010100 */
348 prop->sink_ports = 0xA; /* BITMAP: 00001010 */
350 nval = hweight32(prop->source_ports);
351 prop->src_dpn_prop = devm_kcalloc(&slave->dev, nval,
352 sizeof(*prop->src_dpn_prop),
354 if (!prop->src_dpn_prop)
355 return -ENOMEM;
358 dpn = prop->src_dpn_prop;
359 addr = prop->source_ports;
369 nval = hweight32(prop->sink_ports);
370 prop->sink_dpn_prop = devm_kcalloc(&slave->dev, nval,
371 sizeof(*prop->sink_dpn_prop),
373 if (!prop->sink_dpn_prop)
374 return -ENOMEM;
377 dpn = prop->sink_dpn_prop;
378 addr = prop->sink_ports;
388 prop->clk_stop_timeout = 20;
390 /* wake-up event */
391 prop->wake_capable = 1;
396 static int rt700_bus_config(struct sdw_slave *slave,
399 struct rt700_priv *rt700 = dev_get_drvdata(&slave->dev);
402 memcpy(&rt700->params, params, sizeof(*params));
404 ret = rt700_clock_config(&slave->dev);
405 if (ret < 0)
406 dev_err(&slave->dev, "Invalid clk config");
411 static int rt700_interrupt_callback(struct sdw_slave *slave,
414 struct rt700_priv *rt700 = dev_get_drvdata(&slave->dev);
416 dev_dbg(&slave->dev,
417 "%s control_port_stat=%x", __func__, status->control_port);
419 mutex_lock(&rt700->disable_irq_lock);
420 if (status->control_port & 0x4 && !rt700->disable_irq) {
422 &rt700->jack_detect_work, msecs_to_jiffies(250));
424 mutex_unlock(&rt700->disable_irq_lock);
440 static int rt700_sdw_probe(struct sdw_slave *slave,
446 sdw_regmap = devm_regmap_init_sdw(slave, &rt700_sdw_regmap);
447 if (IS_ERR(sdw_regmap))
450 regmap = devm_regmap_init(&slave->dev, NULL,
451 &slave->dev, &rt700_regmap);
452 if (IS_ERR(regmap))
455 return rt700_init(&slave->dev, sdw_regmap, regmap, slave);
458 static int rt700_sdw_remove(struct sdw_slave *slave)
460 struct rt700_priv *rt700 = dev_get_drvdata(&slave->dev);
462 if (rt700->hw_init) {
463 cancel_delayed_work_sync(&rt700->jack_detect_work);
464 cancel_delayed_work_sync(&rt700->jack_btn_check_work);
467 pm_runtime_disable(&slave->dev);
482 if (!rt700->hw_init)
485 cancel_delayed_work_sync(&rt700->jack_detect_work);
486 cancel_delayed_work_sync(&rt700->jack_btn_check_work);
488 regcache_cache_only(rt700->regmap, true);
495 struct sdw_slave *slave = dev_to_sdw_dev(dev);
499 if (!rt700->hw_init)
507 mutex_lock(&rt700->disable_irq_lock);
508 rt700->disable_irq = true;
509 ret = sdw_update_no_pm(slave, SDW_SCP_INTMASK1,
511 mutex_unlock(&rt700->disable_irq_lock);
513 if (ret < 0) {
515 dev_dbg(&slave->dev, "%s: could not disable imp-def interrupts\n:", __func__);
525 struct sdw_slave *slave = dev_to_sdw_dev(dev);
529 if (!rt700->first_hw_init)
532 if (!slave->unattach_request)
535 time = wait_for_completion_timeout(&slave->initialization_complete,
537 if (!time) {
538 dev_err(&slave->dev, "Initialization not complete, timed out\n");
539 sdw_show_ping_status(slave->bus, true);
541 return -ETIMEDOUT;
545 slave->unattach_request = 0;
546 regcache_cache_only(rt700->regmap, false);
547 regcache_sync_region(rt700->regmap, 0x3000, 0x8fff);
548 regcache_sync_region(rt700->regmap, 0x752010, 0x75206b);