rt5682-sdw.c (3f3d66ba998fb079c1239430e96e3b138bc63166) rt5682-sdw.c (6ab18105029ca3d739dd4c5c18638c7c6d568bbb)
1// SPDX-License-Identifier: GPL-2.0-only
2//
3// rt5682-sdw.c -- RT5682 ALSA SoC audio component driver
4//
5// Copyright 2019 Realtek Semiconductor Corp.
6// Author: Oder Chiou <oder_chiou@realtek.com>
7//
8

--- 308 unchanged lines hidden (view full) ---

317 &rt5682_sdw_indirect_regmap);
318 if (IS_ERR(rt5682->regmap)) {
319 ret = PTR_ERR(rt5682->regmap);
320 dev_err(dev, "Failed to allocate register map: %d\n",
321 ret);
322 return ret;
323 }
324
1// SPDX-License-Identifier: GPL-2.0-only
2//
3// rt5682-sdw.c -- RT5682 ALSA SoC audio component driver
4//
5// Copyright 2019 Realtek Semiconductor Corp.
6// Author: Oder Chiou <oder_chiou@realtek.com>
7//
8

--- 308 unchanged lines hidden (view full) ---

317 &rt5682_sdw_indirect_regmap);
318 if (IS_ERR(rt5682->regmap)) {
319 ret = PTR_ERR(rt5682->regmap);
320 dev_err(dev, "Failed to allocate register map: %d\n",
321 ret);
322 return ret;
323 }
324
325 regcache_cache_only(rt5682->sdw_regmap, true);
326 regcache_cache_only(rt5682->regmap, true);
327
325 /*
326 * Mark hw_init to false
327 * HW init will be performed when device reports present
328 */
329 rt5682->hw_init = false;
330 rt5682->first_hw_init = false;
331
332 mutex_init(&rt5682->calibrate_mutex);

--- 14 unchanged lines hidden (view full) ---

347 int ret = 0, loop = 10;
348 unsigned int val;
349
350 rt5682->disable_irq = false;
351
352 if (rt5682->hw_init)
353 return 0;
354
328 /*
329 * Mark hw_init to false
330 * HW init will be performed when device reports present
331 */
332 rt5682->hw_init = false;
333 rt5682->first_hw_init = false;
334
335 mutex_init(&rt5682->calibrate_mutex);

--- 14 unchanged lines hidden (view full) ---

350 int ret = 0, loop = 10;
351 unsigned int val;
352
353 rt5682->disable_irq = false;
354
355 if (rt5682->hw_init)
356 return 0;
357
358 regcache_cache_only(rt5682->sdw_regmap, false);
359 regcache_cache_only(rt5682->regmap, false);
360 if (rt5682->first_hw_init)
361 regcache_cache_bypass(rt5682->regmap, true);
362
355 /*
356 * PM runtime is only enabled when a Slave reports as Attached
357 */
358 if (!rt5682->first_hw_init) {
359 /* set autosuspend parameters */
360 pm_runtime_set_autosuspend_delay(&slave->dev, 3000);
361 pm_runtime_use_autosuspend(&slave->dev);
362
363 /* update count of parent 'active' children */
364 pm_runtime_set_active(&slave->dev);
365
366 /* make sure the device does not suspend immediately */
367 pm_runtime_mark_last_busy(&slave->dev);
368
369 pm_runtime_enable(&slave->dev);
370 }
371
372 pm_runtime_get_noresume(&slave->dev);
373
363 /*
364 * PM runtime is only enabled when a Slave reports as Attached
365 */
366 if (!rt5682->first_hw_init) {
367 /* set autosuspend parameters */
368 pm_runtime_set_autosuspend_delay(&slave->dev, 3000);
369 pm_runtime_use_autosuspend(&slave->dev);
370
371 /* update count of parent 'active' children */
372 pm_runtime_set_active(&slave->dev);
373
374 /* make sure the device does not suspend immediately */
375 pm_runtime_mark_last_busy(&slave->dev);
376
377 pm_runtime_enable(&slave->dev);
378 }
379
380 pm_runtime_get_noresume(&slave->dev);
381
374 if (rt5682->first_hw_init) {
375 regcache_cache_only(rt5682->regmap, false);
376 regcache_cache_bypass(rt5682->regmap, true);
377 }
378
379 while (loop > 0) {
380 regmap_read(rt5682->regmap, RT5682_DEVICE_ID, &val);
381 if (val == DEVICE_ID)
382 break;
383 dev_warn(dev, "Device with ID register %x is not rt5682\n", val);
384 usleep_range(30000, 30005);
385 loop--;
386 }

--- 313 unchanged lines hidden (view full) ---

700{
701 struct rt5682_priv *rt5682 = dev_get_drvdata(dev);
702
703 if (!rt5682->hw_init)
704 return 0;
705
706 cancel_delayed_work_sync(&rt5682->jack_detect_work);
707
382 while (loop > 0) {
383 regmap_read(rt5682->regmap, RT5682_DEVICE_ID, &val);
384 if (val == DEVICE_ID)
385 break;
386 dev_warn(dev, "Device with ID register %x is not rt5682\n", val);
387 usleep_range(30000, 30005);
388 loop--;
389 }

--- 313 unchanged lines hidden (view full) ---

703{
704 struct rt5682_priv *rt5682 = dev_get_drvdata(dev);
705
706 if (!rt5682->hw_init)
707 return 0;
708
709 cancel_delayed_work_sync(&rt5682->jack_detect_work);
710
711 regcache_cache_only(rt5682->sdw_regmap, true);
708 regcache_cache_only(rt5682->regmap, true);
709 regcache_mark_dirty(rt5682->regmap);
710
711 return 0;
712}
713
714static int __maybe_unused rt5682_dev_system_suspend(struct device *dev)
715{

--- 48 unchanged lines hidden (view full) ---

764 dev_err(&slave->dev, "Initialization not complete, timed out\n");
765 sdw_show_ping_status(slave->bus, true);
766
767 return -ETIMEDOUT;
768 }
769
770regmap_sync:
771 slave->unattach_request = 0;
712 regcache_cache_only(rt5682->regmap, true);
713 regcache_mark_dirty(rt5682->regmap);
714
715 return 0;
716}
717
718static int __maybe_unused rt5682_dev_system_suspend(struct device *dev)
719{

--- 48 unchanged lines hidden (view full) ---

768 dev_err(&slave->dev, "Initialization not complete, timed out\n");
769 sdw_show_ping_status(slave->bus, true);
770
771 return -ETIMEDOUT;
772 }
773
774regmap_sync:
775 slave->unattach_request = 0;
776 regcache_cache_only(rt5682->sdw_regmap, false);
772 regcache_cache_only(rt5682->regmap, false);
773 regcache_sync(rt5682->regmap);
774
775 return 0;
776}
777
778static const struct dev_pm_ops rt5682_pm = {
779 SET_SYSTEM_SLEEP_PM_OPS(rt5682_dev_system_suspend, rt5682_dev_resume)

--- 19 unchanged lines hidden ---
777 regcache_cache_only(rt5682->regmap, false);
778 regcache_sync(rt5682->regmap);
779
780 return 0;
781}
782
783static const struct dev_pm_ops rt5682_pm = {
784 SET_SYSTEM_SLEEP_PM_OPS(rt5682_dev_system_suspend, rt5682_dev_resume)

--- 19 unchanged lines hidden ---