Lines Matching +full:slave +full:- +full:dev

1 // SPDX-License-Identifier: GPL-2.0-only
3 // rt712-sdca-sdw.c -- rt712 SDCA ALSA SoC audio driver
15 #include "rt712-sdca.h"
16 #include "rt712-sdca-sdw.h"
18 static bool rt712_sdca_readable_register(struct device *dev, unsigned int reg) in rt712_sdca_readable_register() argument
44 static bool rt712_sdca_volatile_register(struct device *dev, unsigned int reg) in rt712_sdca_volatile_register() argument
66 static bool rt712_sdca_mbq_readable_register(struct device *dev, unsigned int reg) in rt712_sdca_mbq_readable_register() argument
94 static bool rt712_sdca_mbq_volatile_register(struct device *dev, unsigned int reg) in rt712_sdca_mbq_volatile_register() argument
125 .name = "sdw-mbq",
138 static int rt712_sdca_update_status(struct sdw_slave *slave, in rt712_sdca_update_status() argument
141 struct rt712_sdca_priv *rt712 = dev_get_drvdata(&slave->dev); in rt712_sdca_update_status()
144 rt712->hw_init = false; in rt712_sdca_update_status()
147 if (rt712->hs_jack) { in rt712_sdca_update_status()
154 sdw_write_no_pm(rt712->slave, SDW_SCP_SDCA_INTMASK1, in rt712_sdca_update_status()
156 sdw_write_no_pm(rt712->slave, SDW_SCP_SDCA_INTMASK2, in rt712_sdca_update_status()
162 * Perform initialization only if slave status is present and in rt712_sdca_update_status()
165 if (rt712->hw_init || status != SDW_SLAVE_ATTACHED) in rt712_sdca_update_status()
168 /* perform I/O transfers required for Slave initialization */ in rt712_sdca_update_status()
169 return rt712_sdca_io_init(&slave->dev, slave); in rt712_sdca_update_status()
172 static int rt712_sdca_read_prop(struct sdw_slave *slave) in rt712_sdca_read_prop() argument
174 struct sdw_slave_prop *prop = &slave->prop; in rt712_sdca_read_prop()
181 prop->scp_int1_mask = SDW_SCP_INT1_BUS_CLASH | SDW_SCP_INT1_PARITY; in rt712_sdca_read_prop()
182 prop->quirks = SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY; in rt712_sdca_read_prop()
184 prop->paging_support = true; in rt712_sdca_read_prop()
187 prop->source_ports = BIT(4); /* BITMAP: 00010000 */ in rt712_sdca_read_prop()
188 prop->sink_ports = BIT(3) | BIT(1); /* BITMAP: 00001010 */ in rt712_sdca_read_prop()
190 nval = hweight32(prop->source_ports); in rt712_sdca_read_prop()
191 prop->src_dpn_prop = devm_kcalloc(&slave->dev, nval, in rt712_sdca_read_prop()
192 sizeof(*prop->src_dpn_prop), GFP_KERNEL); in rt712_sdca_read_prop()
193 if (!prop->src_dpn_prop) in rt712_sdca_read_prop()
194 return -ENOMEM; in rt712_sdca_read_prop()
197 dpn = prop->src_dpn_prop; in rt712_sdca_read_prop()
198 addr = prop->source_ports; in rt712_sdca_read_prop()
208 nval = hweight32(prop->sink_ports); in rt712_sdca_read_prop()
209 prop->sink_dpn_prop = devm_kcalloc(&slave->dev, nval, in rt712_sdca_read_prop()
210 sizeof(*prop->sink_dpn_prop), GFP_KERNEL); in rt712_sdca_read_prop()
211 if (!prop->sink_dpn_prop) in rt712_sdca_read_prop()
212 return -ENOMEM; in rt712_sdca_read_prop()
215 dpn = prop->sink_dpn_prop; in rt712_sdca_read_prop()
216 addr = prop->sink_ports; in rt712_sdca_read_prop()
226 prop->clk_stop_timeout = 1380; in rt712_sdca_read_prop()
228 /* wake-up event */ in rt712_sdca_read_prop()
229 prop->wake_capable = 1; in rt712_sdca_read_prop()
234 static int rt712_sdca_interrupt_callback(struct sdw_slave *slave, in rt712_sdca_interrupt_callback() argument
237 struct rt712_sdca_priv *rt712 = dev_get_drvdata(&slave->dev); in rt712_sdca_interrupt_callback()
242 dev_dbg(&slave->dev, in rt712_sdca_interrupt_callback()
244 status->control_port, status->sdca_cascade); in rt712_sdca_interrupt_callback()
246 if (cancel_delayed_work_sync(&rt712->jack_detect_work)) { in rt712_sdca_interrupt_callback()
247 dev_warn(&slave->dev, "%s the pending delayed_work was cancelled", __func__); in rt712_sdca_interrupt_callback()
249 if (rt712->scp_sdca_stat2) in rt712_sdca_interrupt_callback()
250 scp_sdca_stat2 = rt712->scp_sdca_stat2; in rt712_sdca_interrupt_callback()
260 mutex_lock(&rt712->disable_irq_lock); in rt712_sdca_interrupt_callback()
262 ret = sdw_read_no_pm(rt712->slave, SDW_SCP_SDCA_INT1); in rt712_sdca_interrupt_callback()
265 rt712->scp_sdca_stat1 = ret; in rt712_sdca_interrupt_callback()
266 ret = sdw_read_no_pm(rt712->slave, SDW_SCP_SDCA_INT2); in rt712_sdca_interrupt_callback()
269 rt712->scp_sdca_stat2 = ret; in rt712_sdca_interrupt_callback()
271 rt712->scp_sdca_stat2 |= scp_sdca_stat2; in rt712_sdca_interrupt_callback()
275 ret = sdw_read_no_pm(rt712->slave, SDW_SCP_SDCA_INT1); in rt712_sdca_interrupt_callback()
279 ret = sdw_write_no_pm(rt712->slave, SDW_SCP_SDCA_INT1, in rt712_sdca_interrupt_callback()
284 ret = sdw_read_no_pm(rt712->slave, SDW_SCP_SDCA_INT2); in rt712_sdca_interrupt_callback()
288 ret = sdw_write_no_pm(rt712->slave, SDW_SCP_SDCA_INT2, in rt712_sdca_interrupt_callback()
295 ret = sdw_read_no_pm(rt712->slave, SDW_DP0_INT); in rt712_sdca_interrupt_callback()
300 ret = sdw_read_no_pm(rt712->slave, SDW_SCP_SDCA_INT1); in rt712_sdca_interrupt_callback()
305 ret = sdw_read_no_pm(rt712->slave, SDW_SCP_SDCA_INT2); in rt712_sdca_interrupt_callback()
316 dev_warn(&slave->dev, in rt712_sdca_interrupt_callback()
318 rt712->scp_sdca_stat1, rt712->scp_sdca_stat2); in rt712_sdca_interrupt_callback()
320 if (status->sdca_cascade && !rt712->disable_irq) in rt712_sdca_interrupt_callback()
322 &rt712->jack_detect_work, msecs_to_jiffies(30)); in rt712_sdca_interrupt_callback()
324 mutex_unlock(&rt712->disable_irq_lock); in rt712_sdca_interrupt_callback()
329 mutex_unlock(&rt712->disable_irq_lock); in rt712_sdca_interrupt_callback()
340 static int rt712_sdca_sdw_probe(struct sdw_slave *slave, in rt712_sdca_sdw_probe() argument
346 mbq_regmap = devm_regmap_init_sdw_mbq(slave, &rt712_sdca_mbq_regmap); in rt712_sdca_sdw_probe()
350 regmap = devm_regmap_init_sdw(slave, &rt712_sdca_regmap); in rt712_sdca_sdw_probe()
354 return rt712_sdca_init(&slave->dev, regmap, mbq_regmap, slave); in rt712_sdca_sdw_probe()
357 static int rt712_sdca_sdw_remove(struct sdw_slave *slave) in rt712_sdca_sdw_remove() argument
359 struct rt712_sdca_priv *rt712 = dev_get_drvdata(&slave->dev); in rt712_sdca_sdw_remove()
361 if (rt712->hw_init) { in rt712_sdca_sdw_remove()
362 cancel_delayed_work_sync(&rt712->jack_detect_work); in rt712_sdca_sdw_remove()
363 cancel_delayed_work_sync(&rt712->jack_btn_check_work); in rt712_sdca_sdw_remove()
366 pm_runtime_disable(&slave->dev); in rt712_sdca_sdw_remove()
368 mutex_destroy(&rt712->calibrate_mutex); in rt712_sdca_sdw_remove()
369 mutex_destroy(&rt712->disable_irq_lock); in rt712_sdca_sdw_remove()
383 static int __maybe_unused rt712_sdca_dev_suspend(struct device *dev) in rt712_sdca_dev_suspend() argument
385 struct rt712_sdca_priv *rt712 = dev_get_drvdata(dev); in rt712_sdca_dev_suspend()
387 if (!rt712->hw_init) in rt712_sdca_dev_suspend()
390 cancel_delayed_work_sync(&rt712->jack_detect_work); in rt712_sdca_dev_suspend()
391 cancel_delayed_work_sync(&rt712->jack_btn_check_work); in rt712_sdca_dev_suspend()
393 regcache_cache_only(rt712->regmap, true); in rt712_sdca_dev_suspend()
394 regcache_cache_only(rt712->mbq_regmap, true); in rt712_sdca_dev_suspend()
399 static int __maybe_unused rt712_sdca_dev_system_suspend(struct device *dev) in rt712_sdca_dev_system_suspend() argument
401 struct rt712_sdca_priv *rt712_sdca = dev_get_drvdata(dev); in rt712_sdca_dev_system_suspend()
402 struct sdw_slave *slave = dev_to_sdw_dev(dev); in rt712_sdca_dev_system_suspend() local
405 if (!rt712_sdca->hw_init) in rt712_sdca_dev_system_suspend()
413 mutex_lock(&rt712_sdca->disable_irq_lock); in rt712_sdca_dev_system_suspend()
414 rt712_sdca->disable_irq = true; in rt712_sdca_dev_system_suspend()
415 ret1 = sdw_update_no_pm(slave, SDW_SCP_SDCA_INTMASK1, in rt712_sdca_dev_system_suspend()
417 ret2 = sdw_update_no_pm(slave, SDW_SCP_SDCA_INTMASK2, in rt712_sdca_dev_system_suspend()
419 mutex_unlock(&rt712_sdca->disable_irq_lock); in rt712_sdca_dev_system_suspend()
423 dev_dbg(&slave->dev, "%s: could not disable SDCA interrupts\n:", __func__); in rt712_sdca_dev_system_suspend()
426 return rt712_sdca_dev_suspend(dev); in rt712_sdca_dev_system_suspend()
431 static int __maybe_unused rt712_sdca_dev_resume(struct device *dev) in rt712_sdca_dev_resume() argument
433 struct sdw_slave *slave = dev_to_sdw_dev(dev); in rt712_sdca_dev_resume() local
434 struct rt712_sdca_priv *rt712 = dev_get_drvdata(dev); in rt712_sdca_dev_resume()
437 if (!rt712->first_hw_init) in rt712_sdca_dev_resume()
440 if (!slave->unattach_request) { in rt712_sdca_dev_resume()
441 mutex_lock(&rt712->disable_irq_lock); in rt712_sdca_dev_resume()
442 if (rt712->disable_irq == true) { in rt712_sdca_dev_resume()
444 sdw_write_no_pm(slave, SDW_SCP_SDCA_INTMASK1, SDW_SCP_SDCA_INTMASK_SDCA_0); in rt712_sdca_dev_resume()
445 sdw_write_no_pm(slave, SDW_SCP_SDCA_INTMASK2, SDW_SCP_SDCA_INTMASK_SDCA_8); in rt712_sdca_dev_resume()
446 rt712->disable_irq = false; in rt712_sdca_dev_resume()
448 mutex_unlock(&rt712->disable_irq_lock); in rt712_sdca_dev_resume()
452 time = wait_for_completion_timeout(&slave->initialization_complete, in rt712_sdca_dev_resume()
455 dev_err(&slave->dev, "Initialization not complete, timed out\n"); in rt712_sdca_dev_resume()
456 sdw_show_ping_status(slave->bus, true); in rt712_sdca_dev_resume()
458 return -ETIMEDOUT; in rt712_sdca_dev_resume()
462 slave->unattach_request = 0; in rt712_sdca_dev_resume()
463 regcache_cache_only(rt712->regmap, false); in rt712_sdca_dev_resume()
464 regcache_sync(rt712->regmap); in rt712_sdca_dev_resume()
465 regcache_cache_only(rt712->mbq_regmap, false); in rt712_sdca_dev_resume()
466 regcache_sync(rt712->mbq_regmap); in rt712_sdca_dev_resume()
477 .name = "rt712-sdca",