Lines Matching +full:slave +full:- +full:dev
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"
19 static bool rt711_sdca_readable_register(struct device *dev, unsigned int reg) in rt711_sdca_readable_register() argument
45 static bool rt711_sdca_volatile_register(struct device *dev, unsigned int reg) in rt711_sdca_volatile_register() argument
68 static bool rt711_sdca_mbq_readable_register(struct device *dev, unsigned int reg) in rt711_sdca_mbq_readable_register() argument
95 static bool rt711_sdca_mbq_volatile_register(struct device *dev, unsigned int reg) in rt711_sdca_mbq_volatile_register() argument
128 .name = "sdw-mbq",
141 static int rt711_sdca_update_status(struct sdw_slave *slave, in rt711_sdca_update_status() argument
144 struct rt711_sdca_priv *rt711 = dev_get_drvdata(&slave->dev); in rt711_sdca_update_status()
147 rt711->hw_init = false; in rt711_sdca_update_status()
150 if (rt711->hs_jack) { in rt711_sdca_update_status()
157 sdw_write_no_pm(rt711->slave, SDW_SCP_SDCA_INTMASK1, in rt711_sdca_update_status()
159 sdw_write_no_pm(rt711->slave, SDW_SCP_SDCA_INTMASK2, in rt711_sdca_update_status()
165 * Perform initialization only if slave status is present and in rt711_sdca_update_status()
168 if (rt711->hw_init || status != SDW_SLAVE_ATTACHED) in rt711_sdca_update_status()
171 /* perform I/O transfers required for Slave initialization */ in rt711_sdca_update_status()
172 return rt711_sdca_io_init(&slave->dev, slave); in rt711_sdca_update_status()
175 static int rt711_sdca_read_prop(struct sdw_slave *slave) in rt711_sdca_read_prop() argument
177 struct sdw_slave_prop *prop = &slave->prop; in rt711_sdca_read_prop()
184 prop->scp_int1_mask = SDW_SCP_INT1_BUS_CLASH | SDW_SCP_INT1_PARITY; in rt711_sdca_read_prop()
185 prop->quirks = SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY; in rt711_sdca_read_prop()
187 prop->paging_support = true; in rt711_sdca_read_prop()
190 prop->source_ports = 0x14; /* BITMAP: 00010100 */ in rt711_sdca_read_prop()
191 prop->sink_ports = 0x8; /* BITMAP: 00001000 */ in rt711_sdca_read_prop()
193 nval = hweight32(prop->source_ports); in rt711_sdca_read_prop()
194 prop->src_dpn_prop = devm_kcalloc(&slave->dev, nval, in rt711_sdca_read_prop()
195 sizeof(*prop->src_dpn_prop), GFP_KERNEL); in rt711_sdca_read_prop()
196 if (!prop->src_dpn_prop) in rt711_sdca_read_prop()
197 return -ENOMEM; in rt711_sdca_read_prop()
200 dpn = prop->src_dpn_prop; in rt711_sdca_read_prop()
201 addr = prop->source_ports; in rt711_sdca_read_prop()
211 nval = hweight32(prop->sink_ports); in rt711_sdca_read_prop()
212 prop->sink_dpn_prop = devm_kcalloc(&slave->dev, nval, in rt711_sdca_read_prop()
213 sizeof(*prop->sink_dpn_prop), GFP_KERNEL); in rt711_sdca_read_prop()
214 if (!prop->sink_dpn_prop) in rt711_sdca_read_prop()
215 return -ENOMEM; in rt711_sdca_read_prop()
218 dpn = prop->sink_dpn_prop; in rt711_sdca_read_prop()
219 addr = prop->sink_ports; in rt711_sdca_read_prop()
229 prop->clk_stop_timeout = 700; in rt711_sdca_read_prop()
231 /* wake-up event */ in rt711_sdca_read_prop()
232 prop->wake_capable = 1; in rt711_sdca_read_prop()
237 static int rt711_sdca_interrupt_callback(struct sdw_slave *slave, in rt711_sdca_interrupt_callback() argument
240 struct rt711_sdca_priv *rt711 = dev_get_drvdata(&slave->dev); in rt711_sdca_interrupt_callback()
245 dev_dbg(&slave->dev, in rt711_sdca_interrupt_callback()
247 status->control_port, status->sdca_cascade); in rt711_sdca_interrupt_callback()
249 if (cancel_delayed_work_sync(&rt711->jack_detect_work)) { in rt711_sdca_interrupt_callback()
250 dev_warn(&slave->dev, "%s the pending delayed_work was cancelled", __func__); in rt711_sdca_interrupt_callback()
252 if (rt711->scp_sdca_stat2) in rt711_sdca_interrupt_callback()
253 scp_sdca_stat2 = rt711->scp_sdca_stat2; in rt711_sdca_interrupt_callback()
263 mutex_lock(&rt711->disable_irq_lock); in rt711_sdca_interrupt_callback()
265 ret = sdw_read_no_pm(rt711->slave, SDW_SCP_SDCA_INT1); in rt711_sdca_interrupt_callback()
268 rt711->scp_sdca_stat1 = ret; in rt711_sdca_interrupt_callback()
269 ret = sdw_read_no_pm(rt711->slave, SDW_SCP_SDCA_INT2); in rt711_sdca_interrupt_callback()
272 rt711->scp_sdca_stat2 = ret; in rt711_sdca_interrupt_callback()
274 rt711->scp_sdca_stat2 |= scp_sdca_stat2; in rt711_sdca_interrupt_callback()
278 ret = sdw_read_no_pm(rt711->slave, SDW_SCP_SDCA_INT1); in rt711_sdca_interrupt_callback()
282 ret = sdw_write_no_pm(rt711->slave, SDW_SCP_SDCA_INT1, in rt711_sdca_interrupt_callback()
287 ret = sdw_read_no_pm(rt711->slave, SDW_SCP_SDCA_INT2); in rt711_sdca_interrupt_callback()
291 ret = sdw_write_no_pm(rt711->slave, SDW_SCP_SDCA_INT2, in rt711_sdca_interrupt_callback()
298 ret = sdw_read_no_pm(rt711->slave, SDW_DP0_INT); in rt711_sdca_interrupt_callback()
303 ret = sdw_read_no_pm(rt711->slave, SDW_SCP_SDCA_INT1); in rt711_sdca_interrupt_callback()
308 ret = sdw_read_no_pm(rt711->slave, SDW_SCP_SDCA_INT2); in rt711_sdca_interrupt_callback()
319 dev_warn(&slave->dev, in rt711_sdca_interrupt_callback()
321 rt711->scp_sdca_stat1, rt711->scp_sdca_stat2); in rt711_sdca_interrupt_callback()
323 if (status->sdca_cascade && !rt711->disable_irq) in rt711_sdca_interrupt_callback()
325 &rt711->jack_detect_work, msecs_to_jiffies(30)); in rt711_sdca_interrupt_callback()
327 mutex_unlock(&rt711->disable_irq_lock); in rt711_sdca_interrupt_callback()
332 mutex_unlock(&rt711->disable_irq_lock); in rt711_sdca_interrupt_callback()
343 static int rt711_sdca_sdw_probe(struct sdw_slave *slave, in rt711_sdca_sdw_probe() argument
349 mbq_regmap = devm_regmap_init_sdw_mbq(slave, &rt711_sdca_mbq_regmap); in rt711_sdca_sdw_probe()
353 regmap = devm_regmap_init_sdw(slave, &rt711_sdca_regmap); in rt711_sdca_sdw_probe()
357 return rt711_sdca_init(&slave->dev, regmap, mbq_regmap, slave); in rt711_sdca_sdw_probe()
360 static int rt711_sdca_sdw_remove(struct sdw_slave *slave) in rt711_sdca_sdw_remove() argument
362 struct rt711_sdca_priv *rt711 = dev_get_drvdata(&slave->dev); in rt711_sdca_sdw_remove()
364 if (rt711->hw_init) { in rt711_sdca_sdw_remove()
365 cancel_delayed_work_sync(&rt711->jack_detect_work); in rt711_sdca_sdw_remove()
366 cancel_delayed_work_sync(&rt711->jack_btn_check_work); in rt711_sdca_sdw_remove()
369 pm_runtime_disable(&slave->dev); in rt711_sdca_sdw_remove()
371 mutex_destroy(&rt711->calibrate_mutex); in rt711_sdca_sdw_remove()
372 mutex_destroy(&rt711->disable_irq_lock); in rt711_sdca_sdw_remove()
383 static int __maybe_unused rt711_sdca_dev_suspend(struct device *dev) in rt711_sdca_dev_suspend() argument
385 struct rt711_sdca_priv *rt711 = dev_get_drvdata(dev); in rt711_sdca_dev_suspend()
387 if (!rt711->hw_init) in rt711_sdca_dev_suspend()
390 cancel_delayed_work_sync(&rt711->jack_detect_work); in rt711_sdca_dev_suspend()
391 cancel_delayed_work_sync(&rt711->jack_btn_check_work); in rt711_sdca_dev_suspend()
393 regcache_cache_only(rt711->regmap, true); in rt711_sdca_dev_suspend()
394 regcache_cache_only(rt711->mbq_regmap, true); in rt711_sdca_dev_suspend()
399 static int __maybe_unused rt711_sdca_dev_system_suspend(struct device *dev) in rt711_sdca_dev_system_suspend() argument
401 struct rt711_sdca_priv *rt711_sdca = dev_get_drvdata(dev); in rt711_sdca_dev_system_suspend()
402 struct sdw_slave *slave = dev_to_sdw_dev(dev); in rt711_sdca_dev_system_suspend() local
405 if (!rt711_sdca->hw_init) in rt711_sdca_dev_system_suspend()
413 mutex_lock(&rt711_sdca->disable_irq_lock); in rt711_sdca_dev_system_suspend()
414 rt711_sdca->disable_irq = true; in rt711_sdca_dev_system_suspend()
415 ret1 = sdw_update_no_pm(slave, SDW_SCP_SDCA_INTMASK1, in rt711_sdca_dev_system_suspend()
417 ret2 = sdw_update_no_pm(slave, SDW_SCP_SDCA_INTMASK2, in rt711_sdca_dev_system_suspend()
419 mutex_unlock(&rt711_sdca->disable_irq_lock); in rt711_sdca_dev_system_suspend()
423 dev_dbg(&slave->dev, "%s: could not disable SDCA interrupts\n:", __func__); in rt711_sdca_dev_system_suspend()
426 return rt711_sdca_dev_suspend(dev); in rt711_sdca_dev_system_suspend()
431 static int __maybe_unused rt711_sdca_dev_resume(struct device *dev) in rt711_sdca_dev_resume() argument
433 struct sdw_slave *slave = dev_to_sdw_dev(dev); in rt711_sdca_dev_resume() local
434 struct rt711_sdca_priv *rt711 = dev_get_drvdata(dev); in rt711_sdca_dev_resume()
437 if (!rt711->first_hw_init) in rt711_sdca_dev_resume()
440 if (!slave->unattach_request) { in rt711_sdca_dev_resume()
441 mutex_lock(&rt711->disable_irq_lock); in rt711_sdca_dev_resume()
442 if (rt711->disable_irq == true) { in rt711_sdca_dev_resume()
443 sdw_write_no_pm(slave, SDW_SCP_SDCA_INTMASK1, SDW_SCP_SDCA_INTMASK_SDCA_0); in rt711_sdca_dev_resume()
444 sdw_write_no_pm(slave, SDW_SCP_SDCA_INTMASK2, SDW_SCP_SDCA_INTMASK_SDCA_8); in rt711_sdca_dev_resume()
445 rt711->disable_irq = false; in rt711_sdca_dev_resume()
447 mutex_unlock(&rt711->disable_irq_lock); in rt711_sdca_dev_resume()
451 time = wait_for_completion_timeout(&slave->initialization_complete, in rt711_sdca_dev_resume()
454 dev_err(&slave->dev, "Initialization not complete, timed out\n"); in rt711_sdca_dev_resume()
455 sdw_show_ping_status(slave->bus, true); in rt711_sdca_dev_resume()
457 return -ETIMEDOUT; in rt711_sdca_dev_resume()
461 slave->unattach_request = 0; in rt711_sdca_dev_resume()
462 regcache_cache_only(rt711->regmap, false); in rt711_sdca_dev_resume()
463 regcache_sync(rt711->regmap); in rt711_sdca_dev_resume()
464 regcache_cache_only(rt711->mbq_regmap, false); in rt711_sdca_dev_resume()
465 regcache_sync(rt711->mbq_regmap); in rt711_sdca_dev_resume()
476 .name = "rt711-sdca",