Lines Matching +full:slave +full:- +full:if
1 // SPDX-License-Identifier: GPL-2.0-only
3 // rt711-sdw-sdca.c -- rt711 SDCA ALSA SoC audio driver
16 #include "rt711-sdca.h"
17 #include "rt711-sdca-sdw.h"
128 .name = "sdw-mbq",
141 static int rt711_sdca_update_status(struct sdw_slave *slave,
144 struct rt711_sdca_priv *rt711 = dev_get_drvdata(&slave->dev);
146 if (status == SDW_SLAVE_UNATTACHED)
147 rt711->hw_init = false;
149 if (status == SDW_SLAVE_ATTACHED) {
150 if (rt711->hs_jack) {
153 * if the device attached again, we will need to set the setting back.
157 sdw_write_no_pm(rt711->slave, SDW_SCP_SDCA_INTMASK1,
159 sdw_write_no_pm(rt711->slave, SDW_SCP_SDCA_INTMASK2,
165 * Perform initialization only if slave status is present and
168 if (rt711->hw_init || status != SDW_SLAVE_ATTACHED)
171 /* perform I/O transfers required for Slave initialization */
172 return rt711_sdca_io_init(&slave->dev, slave);
175 static int rt711_sdca_read_prop(struct sdw_slave *slave)
177 struct sdw_slave_prop *prop = &slave->prop;
184 prop->scp_int1_mask = SDW_SCP_INT1_BUS_CLASH | SDW_SCP_INT1_PARITY;
185 prop->quirks = SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY;
187 prop->paging_support = true;
190 prop->source_ports = 0x14; /* BITMAP: 00010100 */
191 prop->sink_ports = 0x8; /* BITMAP: 00001000 */
193 nval = hweight32(prop->source_ports);
194 prop->src_dpn_prop = devm_kcalloc(&slave->dev, nval,
195 sizeof(*prop->src_dpn_prop), GFP_KERNEL);
196 if (!prop->src_dpn_prop)
197 return -ENOMEM;
200 dpn = prop->src_dpn_prop;
201 addr = prop->source_ports;
211 nval = hweight32(prop->sink_ports);
212 prop->sink_dpn_prop = devm_kcalloc(&slave->dev, nval,
213 sizeof(*prop->sink_dpn_prop), GFP_KERNEL);
214 if (!prop->sink_dpn_prop)
215 return -ENOMEM;
218 dpn = prop->sink_dpn_prop;
219 addr = prop->sink_ports;
228 prop->dp0_prop = devm_kzalloc(&slave->dev, sizeof(*prop->dp0_prop),
230 if (!prop->dp0_prop)
231 return -ENOMEM;
233 prop->dp0_prop->simple_ch_prep_sm = true;
234 prop->dp0_prop->ch_prep_timeout = 10;
237 prop->clk_stop_timeout = 700;
239 /* wake-up event */
240 prop->wake_capable = 1;
245 static int rt711_sdca_interrupt_callback(struct sdw_slave *slave,
248 struct rt711_sdca_priv *rt711 = dev_get_drvdata(&slave->dev);
253 dev_dbg(&slave->dev,
255 status->control_port, status->sdca_cascade);
257 if (cancel_delayed_work_sync(&rt711->jack_detect_work)) {
258 dev_warn(&slave->dev, "%s the pending delayed_work was cancelled", __func__);
260 if (rt711->scp_sdca_stat2)
261 scp_sdca_stat2 = rt711->scp_sdca_stat2;
268 * scheme. We do want however to prevent new workqueues from being scheduled if
271 mutex_lock(&rt711->disable_irq_lock);
273 ret = sdw_read_no_pm(rt711->slave, SDW_SCP_SDCA_INT1);
274 if (ret < 0)
276 rt711->scp_sdca_stat1 = ret;
277 ret = sdw_read_no_pm(rt711->slave, SDW_SCP_SDCA_INT2);
278 if (ret < 0)
280 rt711->scp_sdca_stat2 = ret;
281 if (scp_sdca_stat2)
282 rt711->scp_sdca_stat2 |= scp_sdca_stat2;
286 ret = sdw_read_no_pm(rt711->slave, SDW_SCP_SDCA_INT1);
287 if (ret < 0)
289 if (ret & SDW_SCP_SDCA_INTMASK_SDCA_0) {
290 ret = sdw_write_no_pm(rt711->slave, SDW_SCP_SDCA_INT1,
292 if (ret < 0)
295 ret = sdw_read_no_pm(rt711->slave, SDW_SCP_SDCA_INT2);
296 if (ret < 0)
298 if (ret & SDW_SCP_SDCA_INTMASK_SDCA_8) {
299 ret = sdw_write_no_pm(rt711->slave, SDW_SCP_SDCA_INT2,
301 if (ret < 0)
305 /* check if flag clear or not */
306 ret = sdw_read_no_pm(rt711->slave, SDW_DP0_INT);
307 if (ret < 0)
311 ret = sdw_read_no_pm(rt711->slave, SDW_SCP_SDCA_INT1);
312 if (ret < 0)
316 ret = sdw_read_no_pm(rt711->slave, SDW_SCP_SDCA_INT2);
317 if (ret < 0)
326 if (stat)
327 dev_warn(&slave->dev,
329 rt711->scp_sdca_stat1, rt711->scp_sdca_stat2);
331 if (status->sdca_cascade && !rt711->disable_irq)
333 &rt711->jack_detect_work, msecs_to_jiffies(30));
335 mutex_unlock(&rt711->disable_irq_lock);
340 mutex_unlock(&rt711->disable_irq_lock);
351 static int rt711_sdca_sdw_probe(struct sdw_slave *slave,
357 mbq_regmap = devm_regmap_init_sdw_mbq(slave, &rt711_sdca_mbq_regmap);
358 if (IS_ERR(mbq_regmap))
361 regmap = devm_regmap_init_sdw(slave, &rt711_sdca_regmap);
362 if (IS_ERR(regmap))
365 return rt711_sdca_init(&slave->dev, regmap, mbq_regmap, slave);
368 static int rt711_sdca_sdw_remove(struct sdw_slave *slave)
370 struct rt711_sdca_priv *rt711 = dev_get_drvdata(&slave->dev);
372 if (rt711->hw_init) {
373 cancel_delayed_work_sync(&rt711->jack_detect_work);
374 cancel_delayed_work_sync(&rt711->jack_btn_check_work);
377 pm_runtime_disable(&slave->dev);
379 mutex_destroy(&rt711->calibrate_mutex);
380 mutex_destroy(&rt711->disable_irq_lock);
395 if (!rt711->hw_init)
398 cancel_delayed_work_sync(&rt711->jack_detect_work);
399 cancel_delayed_work_sync(&rt711->jack_btn_check_work);
401 regcache_cache_only(rt711->regmap, true);
402 regcache_cache_only(rt711->mbq_regmap, true);
410 struct sdw_slave *slave = dev_to_sdw_dev(dev);
413 if (!rt711_sdca->hw_init)
421 mutex_lock(&rt711_sdca->disable_irq_lock);
422 rt711_sdca->disable_irq = true;
423 ret1 = sdw_update_no_pm(slave, SDW_SCP_SDCA_INTMASK1,
425 ret2 = sdw_update_no_pm(slave, SDW_SCP_SDCA_INTMASK2,
427 mutex_unlock(&rt711_sdca->disable_irq_lock);
429 if (ret1 < 0 || ret2 < 0) {
431 dev_dbg(&slave->dev, "%s: could not disable SDCA interrupts\n:", __func__);
441 struct sdw_slave *slave = dev_to_sdw_dev(dev);
445 if (!rt711->first_hw_init)
448 if (!slave->unattach_request) {
449 mutex_lock(&rt711->disable_irq_lock);
450 if (rt711->disable_irq == true) {
451 sdw_write_no_pm(slave, SDW_SCP_SDCA_INTMASK1, SDW_SCP_SDCA_INTMASK_SDCA_0);
452 sdw_write_no_pm(slave, SDW_SCP_SDCA_INTMASK2, SDW_SCP_SDCA_INTMASK_SDCA_8);
453 rt711->disable_irq = false;
455 mutex_unlock(&rt711->disable_irq_lock);
459 time = wait_for_completion_timeout(&slave->initialization_complete,
461 if (!time) {
462 dev_err(&slave->dev, "%s: Initialization not complete, timed out\n", __func__);
463 sdw_show_ping_status(slave->bus, true);
465 return -ETIMEDOUT;
469 slave->unattach_request = 0;
470 regcache_cache_only(rt711->regmap, false);
471 regcache_sync(rt711->regmap);
472 regcache_cache_only(rt711->mbq_regmap, false);
473 regcache_sync(rt711->mbq_regmap);
484 .name = "rt711-sdca",