Lines Matching refs:amd_manager
28 static void amd_enable_sdw_pads(struct amd_sdw_manager *amd_manager) in amd_enable_sdw_pads() argument
33 mutex_lock(amd_manager->acp_sdw_lock); in amd_enable_sdw_pads()
34 val = readl(amd_manager->acp_mmio + ACP_SW_PAD_KEEPER_EN); in amd_enable_sdw_pads()
35 val |= amd_manager->reg_mask->sw_pad_enable_mask; in amd_enable_sdw_pads()
36 writel(val, amd_manager->acp_mmio + ACP_SW_PAD_KEEPER_EN); in amd_enable_sdw_pads()
39 sw_pad_pulldown_val = readl(amd_manager->acp_mmio + ACP_PAD_PULLDOWN_CTRL); in amd_enable_sdw_pads()
40 sw_pad_pulldown_val &= amd_manager->reg_mask->sw_pad_pulldown_mask; in amd_enable_sdw_pads()
41 writel(sw_pad_pulldown_val, amd_manager->acp_mmio + ACP_PAD_PULLDOWN_CTRL); in amd_enable_sdw_pads()
42 mutex_unlock(amd_manager->acp_sdw_lock); in amd_enable_sdw_pads()
45 static int amd_init_sdw_manager(struct amd_sdw_manager *amd_manager) in amd_init_sdw_manager() argument
50 writel(AMD_SDW_ENABLE, amd_manager->mmio + ACP_SW_EN); in amd_init_sdw_manager()
51 ret = readl_poll_timeout(amd_manager->mmio + ACP_SW_EN_STATUS, val, val, ACP_DELAY_US, in amd_init_sdw_manager()
57 writel(AMD_SDW_BUS_RESET_REQ, amd_manager->mmio + ACP_SW_BUS_RESET_CTRL); in amd_init_sdw_manager()
58 ret = readl_poll_timeout(amd_manager->mmio + ACP_SW_BUS_RESET_CTRL, val, in amd_init_sdw_manager()
63 writel(AMD_SDW_BUS_RESET_CLEAR_REQ, amd_manager->mmio + ACP_SW_BUS_RESET_CTRL); in amd_init_sdw_manager()
64 ret = readl_poll_timeout(amd_manager->mmio + ACP_SW_BUS_RESET_CTRL, val, !val, in amd_init_sdw_manager()
67 dev_err(amd_manager->dev, "Failed to reset SoundWire manager instance%d\n", in amd_init_sdw_manager()
68 amd_manager->instance); in amd_init_sdw_manager()
72 writel(AMD_SDW_DISABLE, amd_manager->mmio + ACP_SW_EN); in amd_init_sdw_manager()
73 return readl_poll_timeout(amd_manager->mmio + ACP_SW_EN_STATUS, val, !val, ACP_DELAY_US, in amd_init_sdw_manager()
77 static int amd_enable_sdw_manager(struct amd_sdw_manager *amd_manager) in amd_enable_sdw_manager() argument
81 writel(AMD_SDW_ENABLE, amd_manager->mmio + ACP_SW_EN); in amd_enable_sdw_manager()
82 return readl_poll_timeout(amd_manager->mmio + ACP_SW_EN_STATUS, val, val, ACP_DELAY_US, in amd_enable_sdw_manager()
86 static int amd_disable_sdw_manager(struct amd_sdw_manager *amd_manager) in amd_disable_sdw_manager() argument
90 writel(AMD_SDW_DISABLE, amd_manager->mmio + ACP_SW_EN); in amd_disable_sdw_manager()
96 val = readl(amd_manager->mmio + ACP_SW_CLK_RESUME_CTRL); in amd_disable_sdw_manager()
99 return readl_poll_timeout(amd_manager->mmio + ACP_SW_EN_STATUS, val, !val, ACP_DELAY_US, in amd_disable_sdw_manager()
103 static void amd_enable_sdw_interrupts(struct amd_sdw_manager *amd_manager) in amd_enable_sdw_interrupts() argument
105 struct sdw_manager_reg_mask *reg_mask = amd_manager->reg_mask; in amd_enable_sdw_interrupts()
108 mutex_lock(amd_manager->acp_sdw_lock); in amd_enable_sdw_interrupts()
109 val = readl(amd_manager->acp_mmio + ACP_EXTERNAL_INTR_CNTL(amd_manager->instance)); in amd_enable_sdw_interrupts()
111 writel(val, amd_manager->acp_mmio + ACP_EXTERNAL_INTR_CNTL(amd_manager->instance)); in amd_enable_sdw_interrupts()
112 mutex_unlock(amd_manager->acp_sdw_lock); in amd_enable_sdw_interrupts()
114 writel(AMD_SDW_IRQ_MASK_0TO7, amd_manager->mmio + in amd_enable_sdw_interrupts()
116 writel(AMD_SDW_IRQ_MASK_8TO11, amd_manager->mmio + in amd_enable_sdw_interrupts()
118 writel(AMD_SDW_IRQ_ERROR_MASK, amd_manager->mmio + ACP_SW_ERROR_INTR_MASK); in amd_enable_sdw_interrupts()
121 static void amd_disable_sdw_interrupts(struct amd_sdw_manager *amd_manager) in amd_disable_sdw_interrupts() argument
123 struct sdw_manager_reg_mask *reg_mask = amd_manager->reg_mask; in amd_disable_sdw_interrupts()
126 mutex_lock(amd_manager->acp_sdw_lock); in amd_disable_sdw_interrupts()
127 val = readl(amd_manager->acp_mmio + ACP_EXTERNAL_INTR_CNTL(amd_manager->instance)); in amd_disable_sdw_interrupts()
129 writel(val, amd_manager->acp_mmio + ACP_EXTERNAL_INTR_CNTL(amd_manager->instance)); in amd_disable_sdw_interrupts()
130 mutex_unlock(amd_manager->acp_sdw_lock); in amd_disable_sdw_interrupts()
132 writel(0x00, amd_manager->mmio + ACP_SW_STATE_CHANGE_STATUS_MASK_0TO7); in amd_disable_sdw_interrupts()
133 writel(0x00, amd_manager->mmio + ACP_SW_STATE_CHANGE_STATUS_MASK_8TO11); in amd_disable_sdw_interrupts()
134 writel(0x00, amd_manager->mmio + ACP_SW_ERROR_INTR_MASK); in amd_disable_sdw_interrupts()
137 static int amd_deinit_sdw_manager(struct amd_sdw_manager *amd_manager) in amd_deinit_sdw_manager() argument
139 amd_disable_sdw_interrupts(amd_manager); in amd_deinit_sdw_manager()
140 return amd_disable_sdw_manager(amd_manager); in amd_deinit_sdw_manager()
143 static void amd_sdw_set_frameshape(struct amd_sdw_manager *amd_manager) in amd_sdw_set_frameshape() argument
147 frame_size = (amd_manager->rows_index << 3) | amd_manager->cols_index; in amd_sdw_set_frameshape()
148 writel(frame_size, amd_manager->mmio + ACP_SW_FRAMESIZE); in amd_sdw_set_frameshape()
177 static u64 amd_sdw_send_cmd_get_resp(struct amd_sdw_manager *amd_manager, u32 lower_data, in amd_sdw_send_cmd_get_resp() argument
185 ret = readl_poll_timeout(amd_manager->mmio + ACP_SW_IMM_CMD_STS, sts, in amd_sdw_send_cmd_get_resp()
188 dev_err(amd_manager->dev, "SDW%x previous cmd status clear failed\n", in amd_sdw_send_cmd_get_resp()
189 amd_manager->instance); in amd_sdw_send_cmd_get_resp()
194 dev_err(amd_manager->dev, "SDW%x manager is in bad state\n", amd_manager->instance); in amd_sdw_send_cmd_get_resp()
195 writel(0x00, amd_manager->mmio + ACP_SW_IMM_CMD_STS); in amd_sdw_send_cmd_get_resp()
197 writel(upper_data, amd_manager->mmio + ACP_SW_IMM_CMD_UPPER_WORD); in amd_sdw_send_cmd_get_resp()
198 writel(lower_data, amd_manager->mmio + ACP_SW_IMM_CMD_LOWER_QWORD); in amd_sdw_send_cmd_get_resp()
200 ret = readl_poll_timeout(amd_manager->mmio + ACP_SW_IMM_CMD_STS, sts, in amd_sdw_send_cmd_get_resp()
203 dev_err(amd_manager->dev, "SDW%x cmd response timeout occurred\n", in amd_sdw_send_cmd_get_resp()
204 amd_manager->instance); in amd_sdw_send_cmd_get_resp()
207 upper_resp = readl(amd_manager->mmio + ACP_SW_IMM_RESP_UPPER_WORD); in amd_sdw_send_cmd_get_resp()
208 lower_resp = readl(amd_manager->mmio + ACP_SW_IMM_RESP_LOWER_QWORD); in amd_sdw_send_cmd_get_resp()
210 writel(AMD_SDW_IMM_RES_VALID, amd_manager->mmio + ACP_SW_IMM_CMD_STS); in amd_sdw_send_cmd_get_resp()
211 ret = readl_poll_timeout(amd_manager->mmio + ACP_SW_IMM_CMD_STS, sts, in amd_sdw_send_cmd_get_resp()
214 dev_err(amd_manager->dev, "SDW%x cmd status retry failed\n", in amd_sdw_send_cmd_get_resp()
215 amd_manager->instance); in amd_sdw_send_cmd_get_resp()
224 amd_program_scp_addr(struct amd_sdw_manager *amd_manager, struct sdw_msg *msg) in amd_program_scp_addr() argument
236 response_buf[0] = amd_sdw_send_cmd_get_resp(amd_manager, lower_data, upper_data); in amd_program_scp_addr()
240 response_buf[1] = amd_sdw_send_cmd_get_resp(amd_manager, lower_data, upper_data); in amd_program_scp_addr()
244 dev_err_ratelimited(amd_manager->dev, in amd_program_scp_addr()
250 dev_err_ratelimited(amd_manager->dev, in amd_program_scp_addr()
255 dev_dbg_ratelimited(amd_manager->dev, "SCP_addrpage ignored for Slave %d\n", in amd_program_scp_addr()
263 static int amd_prep_msg(struct amd_sdw_manager *amd_manager, struct sdw_msg *msg) in amd_prep_msg() argument
268 ret = amd_program_scp_addr(amd_manager, msg); in amd_prep_msg()
279 dev_err(amd_manager->dev, "Invalid msg cmd: %d\n", msg->flags); in amd_prep_msg()
285 static enum sdw_command_response amd_sdw_fill_msg_resp(struct amd_sdw_manager *amd_manager, in amd_sdw_fill_msg_resp() argument
294 dev_err_ratelimited(amd_manager->dev, "command timeout for Slave %d\n", in amd_sdw_fill_msg_resp()
298 dev_err_ratelimited(amd_manager->dev, in amd_sdw_fill_msg_resp()
303 dev_err_ratelimited(amd_manager->dev, "command is ignored for Slave %d\n", in amd_sdw_fill_msg_resp()
310 static unsigned int _amd_sdw_xfer_msg(struct amd_sdw_manager *amd_manager, struct sdw_msg *msg, in _amd_sdw_xfer_msg() argument
317 response = amd_sdw_send_cmd_get_resp(amd_manager, lower_data, upper_data); in _amd_sdw_xfer_msg()
318 return amd_sdw_fill_msg_resp(amd_manager, msg, response, cmd_offset); in _amd_sdw_xfer_msg()
323 struct amd_sdw_manager *amd_manager = to_amd_sdw(bus); in amd_sdw_xfer_msg() local
326 ret = amd_prep_msg(amd_manager, msg); in amd_sdw_xfer_msg()
330 ret = _amd_sdw_xfer_msg(amd_manager, msg, i); in amd_sdw_xfer_msg()
337 static void amd_sdw_fill_slave_status(struct amd_sdw_manager *amd_manager, u16 index, u32 status) in amd_sdw_fill_slave_status() argument
343 amd_manager->status[index] = status; in amd_sdw_fill_slave_status()
346 amd_manager->status[index] = SDW_SLAVE_RESERVED; in amd_sdw_fill_slave_status()
351 static void amd_sdw_process_ping_status(u64 response, struct amd_sdw_manager *amd_manager) in amd_sdw_process_ping_status() argument
360 dev_dbg(amd_manager->dev, "slave_stat:0x%llx\n", slave_stat); in amd_sdw_process_ping_status()
363 dev_dbg(amd_manager->dev, "val:0x%x\n", val); in amd_sdw_process_ping_status()
364 amd_sdw_fill_slave_status(amd_manager, dev_index, val); in amd_sdw_process_ping_status()
368 static void amd_sdw_read_and_process_ping_status(struct amd_sdw_manager *amd_manager) in amd_sdw_read_and_process_ping_status() argument
372 mutex_lock(&amd_manager->bus.msg_lock); in amd_sdw_read_and_process_ping_status()
373 response = amd_sdw_send_cmd_get_resp(amd_manager, 0, 0); in amd_sdw_read_and_process_ping_status()
374 mutex_unlock(&amd_manager->bus.msg_lock); in amd_sdw_read_and_process_ping_status()
375 amd_sdw_process_ping_status(response, amd_manager); in amd_sdw_read_and_process_ping_status()
380 struct amd_sdw_manager *amd_manager = to_amd_sdw(bus); in amd_sdw_read_ping_status() local
384 response = amd_sdw_send_cmd_get_resp(amd_manager, 0, 0); in amd_sdw_read_ping_status()
388 dev_dbg(amd_manager->dev, "slave_stat:0x%x\n", slave_stat); in amd_sdw_read_ping_status()
437 struct amd_sdw_manager *amd_manager = to_amd_sdw(bus); in amd_sdw_port_params() local
440 dev_dbg(amd_manager->dev, "p_params->num:0x%x\n", p_params->num); in amd_sdw_port_params()
441 switch (amd_manager->instance) { in amd_sdw_port_params()
452 dpn_frame_fmt = readl(amd_manager->mmio + frame_fmt_reg); in amd_sdw_port_params()
456 writel(dpn_frame_fmt, amd_manager->mmio + frame_fmt_reg); in amd_sdw_port_params()
464 struct amd_sdw_manager *amd_manager = to_amd_sdw(bus); in amd_sdw_transport_params() local
473 switch (amd_manager->instance) { in amd_sdw_transport_params()
491 writel(AMD_SDW_SSP_COUNTER_VAL, amd_manager->mmio + ACP_SW_SSP_COUNTER); in amd_sdw_transport_params()
493 dpn_frame_fmt = readl(amd_manager->mmio + frame_fmt_reg); in amd_sdw_transport_params()
497 writel(dpn_frame_fmt, amd_manager->mmio + frame_fmt_reg); in amd_sdw_transport_params()
500 writel(dpn_sampleinterval, amd_manager->mmio + sample_int_reg); in amd_sdw_transport_params()
504 writel(dpn_hctrl, amd_manager->mmio + hctrl_dp0_reg); in amd_sdw_transport_params()
508 writel(dpn_offsetctrl, amd_manager->mmio + offset_reg); in amd_sdw_transport_params()
514 dpn_lanectrl = readl(amd_manager->mmio + lane_ctrl_ch_en_reg); in amd_sdw_transport_params()
516 writel(dpn_lanectrl, amd_manager->mmio + lane_ctrl_ch_en_reg); in amd_sdw_transport_params()
524 struct amd_sdw_manager *amd_manager = to_amd_sdw(bus); in amd_sdw_port_enable() local
528 switch (amd_manager->instance) { in amd_sdw_port_enable()
543 dpn_ch_enable = readl(amd_manager->mmio + lane_ctrl_ch_en_reg); in amd_sdw_port_enable()
546 writel(dpn_ch_enable, amd_manager->mmio + lane_ctrl_ch_en_reg); in amd_sdw_port_enable()
548 writel(0, amd_manager->mmio + lane_ctrl_ch_en_reg); in amd_sdw_port_enable()
554 struct amd_sdw_manager *amd_manager = to_amd_sdw(bus); in sdw_master_read_amd_prop() local
577 amd_manager->wake_en_mask = wake_en_mask; in sdw_master_read_amd_prop()
579 amd_manager->power_mode_mask = power_mode_mask; in sdw_master_read_amd_prop()
606 struct amd_sdw_manager *amd_manager = snd_soc_dai_get_drvdata(dai); in amd_sdw_hw_params() local
613 dai_runtime = amd_manager->dai_runtime_array[dai->id]; in amd_sdw_hw_params()
622 dev_dbg(amd_manager->dev, "dir:%d dai->id:0x%x\n", dir, dai->id); in amd_sdw_hw_params()
640 ret = sdw_stream_add_master(&amd_manager->bus, &sconfig, in amd_sdw_hw_params()
643 dev_err(amd_manager->dev, "add manager to stream failed:%d\n", ret); in amd_sdw_hw_params()
652 struct amd_sdw_manager *amd_manager = snd_soc_dai_get_drvdata(dai); in amd_sdw_hw_free() local
656 dai_runtime = amd_manager->dai_runtime_array[dai->id]; in amd_sdw_hw_free()
660 ret = sdw_stream_remove_master(&amd_manager->bus, dai_runtime->stream); in amd_sdw_hw_free()
669 struct amd_sdw_manager *amd_manager = snd_soc_dai_get_drvdata(dai); in amd_set_sdw_stream() local
672 dai_runtime = amd_manager->dai_runtime_array[dai->id]; in amd_set_sdw_stream()
686 dai_runtime->bus = &amd_manager->bus; in amd_set_sdw_stream()
688 amd_manager->dai_runtime_array[dai->id] = dai_runtime; in amd_set_sdw_stream()
698 amd_manager->dai_runtime_array[dai->id] = NULL; in amd_set_sdw_stream()
710 struct amd_sdw_manager *amd_manager = snd_soc_dai_get_drvdata(dai); in amd_get_sdw_stream() local
713 dai_runtime = amd_manager->dai_runtime_array[dai->id]; in amd_get_sdw_stream()
731 static int amd_sdw_register_dais(struct amd_sdw_manager *amd_manager) in amd_sdw_register_dais() argument
739 dev = amd_manager->dev; in amd_sdw_register_dais()
740 num_dais = amd_manager->num_dout_ports + amd_manager->num_din_ports; in amd_sdw_register_dais()
750 amd_manager->dai_runtime_array = dai_runtime_array; in amd_sdw_register_dais()
752 dais[i].name = devm_kasprintf(dev, GFP_KERNEL, "SDW%d Pin%d", amd_manager->instance, in amd_sdw_register_dais()
756 if (i < amd_manager->num_dout_ports) in amd_sdw_register_dais()
776 struct amd_sdw_manager *amd_manager = in amd_sdw_update_slave_status_work() local
780 if (amd_manager->status[0] == SDW_SLAVE_ATTACHED) { in amd_sdw_update_slave_status_work()
781 writel(0, amd_manager->mmio + ACP_SW_STATE_CHANGE_STATUS_MASK_0TO7); in amd_sdw_update_slave_status_work()
782 writel(0, amd_manager->mmio + ACP_SW_STATE_CHANGE_STATUS_MASK_8TO11); in amd_sdw_update_slave_status_work()
786 sdw_handle_slave_status(&amd_manager->bus, amd_manager->status); in amd_sdw_update_slave_status_work()
794 if (amd_manager->status[0] == SDW_SLAVE_ATTACHED) { in amd_sdw_update_slave_status_work()
796 writel(AMD_SDW_IRQ_MASK_0TO7, amd_manager->mmio + in amd_sdw_update_slave_status_work()
798 writel(AMD_SDW_IRQ_MASK_8TO11, amd_manager->mmio + in amd_sdw_update_slave_status_work()
800 amd_sdw_read_and_process_ping_status(amd_manager); in amd_sdw_update_slave_status_work()
803 dev_err_ratelimited(amd_manager->dev, in amd_sdw_update_slave_status_work()
811 struct amd_sdw_manager *amd_manager) in amd_sdw_update_slave_status() argument
818 memset(amd_manager->status, 0, sizeof(amd_manager->status)); in amd_sdw_update_slave_status()
821 dev_dbg(amd_manager->dev, "status_change_0to7:0x%x status_change_8to11:0x%x\n", in amd_sdw_update_slave_status()
828 amd_sdw_fill_slave_status(amd_manager, dev_index, val); in amd_sdw_update_slave_status()
834 static void amd_sdw_process_wake_event(struct amd_sdw_manager *amd_manager) in amd_sdw_process_wake_event() argument
836 pm_request_resume(amd_manager->dev); in amd_sdw_process_wake_event()
837 writel(0x00, amd_manager->acp_mmio + ACP_SW_WAKE_EN(amd_manager->instance)); in amd_sdw_process_wake_event()
838 writel(0x00, amd_manager->mmio + ACP_SW_STATE_CHANGE_STATUS_8TO11); in amd_sdw_process_wake_event()
843 struct amd_sdw_manager *amd_manager = in amd_sdw_irq_thread() local
848 status_change_8to11 = readl(amd_manager->mmio + ACP_SW_STATE_CHANGE_STATUS_8TO11); in amd_sdw_irq_thread()
849 status_change_0to7 = readl(amd_manager->mmio + ACP_SW_STATE_CHANGE_STATUS_0TO7); in amd_sdw_irq_thread()
850 dev_dbg(amd_manager->dev, "[SDW%d] SDW INT: 0to7=0x%x, 8to11=0x%x\n", in amd_sdw_irq_thread()
851 amd_manager->instance, status_change_0to7, status_change_8to11); in amd_sdw_irq_thread()
853 return amd_sdw_process_wake_event(amd_manager); in amd_sdw_irq_thread()
856 amd_sdw_read_and_process_ping_status(amd_manager); in amd_sdw_irq_thread()
859 amd_sdw_update_slave_status(status_change_0to7, status_change_8to11, amd_manager); in amd_sdw_irq_thread()
862 schedule_work(&amd_manager->amd_sdw_work); in amd_sdw_irq_thread()
863 writel(0x00, amd_manager->mmio + ACP_SW_STATE_CHANGE_STATUS_8TO11); in amd_sdw_irq_thread()
864 writel(0x00, amd_manager->mmio + ACP_SW_STATE_CHANGE_STATUS_0TO7); in amd_sdw_irq_thread()
869 struct amd_sdw_manager *amd_manager = container_of(work, struct amd_sdw_manager, in amd_sdw_probe_work() local
874 prop = &amd_manager->bus.prop; in amd_sdw_probe_work()
876 amd_enable_sdw_pads(amd_manager); in amd_sdw_probe_work()
877 ret = amd_init_sdw_manager(amd_manager); in amd_sdw_probe_work()
880 amd_enable_sdw_interrupts(amd_manager); in amd_sdw_probe_work()
881 ret = amd_enable_sdw_manager(amd_manager); in amd_sdw_probe_work()
884 amd_sdw_set_frameshape(amd_manager); in amd_sdw_probe_work()
887 pm_runtime_set_autosuspend_delay(amd_manager->dev, AMD_SDW_MASTER_SUSPEND_DELAY_MS); in amd_sdw_probe_work()
888 pm_runtime_use_autosuspend(amd_manager->dev); in amd_sdw_probe_work()
889 pm_runtime_mark_last_busy(amd_manager->dev); in amd_sdw_probe_work()
890 pm_runtime_set_active(amd_manager->dev); in amd_sdw_probe_work()
891 pm_runtime_enable(amd_manager->dev); in amd_sdw_probe_work()
901 struct amd_sdw_manager *amd_manager; in amd_sdw_manager_probe() local
904 amd_manager = devm_kzalloc(dev, sizeof(struct amd_sdw_manager), GFP_KERNEL); in amd_sdw_manager_probe()
905 if (!amd_manager) in amd_sdw_manager_probe()
912 amd_manager->acp_mmio = devm_ioremap(dev, res->start, resource_size(res)); in amd_sdw_manager_probe()
913 if (!amd_manager->acp_mmio) { in amd_sdw_manager_probe()
917 amd_manager->instance = pdata->instance; in amd_sdw_manager_probe()
918 amd_manager->mmio = amd_manager->acp_mmio + in amd_sdw_manager_probe()
919 (amd_manager->instance * SDW_MANAGER_REG_OFFSET); in amd_sdw_manager_probe()
920 amd_manager->acp_sdw_lock = pdata->acp_sdw_lock; in amd_sdw_manager_probe()
921 amd_manager->cols_index = sdw_find_col_index(AMD_SDW_DEFAULT_COLUMNS); in amd_sdw_manager_probe()
922 amd_manager->rows_index = sdw_find_row_index(AMD_SDW_DEFAULT_ROWS); in amd_sdw_manager_probe()
923 amd_manager->dev = dev; in amd_sdw_manager_probe()
924 amd_manager->bus.ops = &amd_sdw_ops; in amd_sdw_manager_probe()
925 amd_manager->bus.port_ops = &amd_sdw_port_ops; in amd_sdw_manager_probe()
926 amd_manager->bus.compute_params = &amd_sdw_compute_params; in amd_sdw_manager_probe()
927 amd_manager->bus.clk_stop_timeout = 200; in amd_sdw_manager_probe()
928 amd_manager->bus.link_id = amd_manager->instance; in amd_sdw_manager_probe()
930 switch (amd_manager->instance) { in amd_sdw_manager_probe()
932 amd_manager->num_dout_ports = AMD_SDW0_MAX_TX_PORTS; in amd_sdw_manager_probe()
933 amd_manager->num_din_ports = AMD_SDW0_MAX_RX_PORTS; in amd_sdw_manager_probe()
936 amd_manager->num_dout_ports = AMD_SDW1_MAX_TX_PORTS; in amd_sdw_manager_probe()
937 amd_manager->num_din_ports = AMD_SDW1_MAX_RX_PORTS; in amd_sdw_manager_probe()
943 amd_manager->reg_mask = &sdw_manager_reg_mask_array[amd_manager->instance]; in amd_sdw_manager_probe()
944 params = &amd_manager->bus.params; in amd_sdw_manager_probe()
949 prop = &amd_manager->bus.prop; in amd_sdw_manager_probe()
953 ret = sdw_bus_master_add(&amd_manager->bus, dev, dev->fwnode); in amd_sdw_manager_probe()
958 ret = amd_sdw_register_dais(amd_manager); in amd_sdw_manager_probe()
961 sdw_bus_master_delete(&amd_manager->bus); in amd_sdw_manager_probe()
964 dev_set_drvdata(dev, amd_manager); in amd_sdw_manager_probe()
965 INIT_WORK(&amd_manager->amd_sdw_irq_thread, amd_sdw_irq_thread); in amd_sdw_manager_probe()
966 INIT_WORK(&amd_manager->amd_sdw_work, amd_sdw_update_slave_status_work); in amd_sdw_manager_probe()
967 INIT_WORK(&amd_manager->probe_work, amd_sdw_probe_work); in amd_sdw_manager_probe()
971 schedule_work(&amd_manager->probe_work); in amd_sdw_manager_probe()
977 struct amd_sdw_manager *amd_manager = dev_get_drvdata(&pdev->dev); in amd_sdw_manager_remove() local
981 cancel_work_sync(&amd_manager->probe_work); in amd_sdw_manager_remove()
982 amd_disable_sdw_interrupts(amd_manager); in amd_sdw_manager_remove()
983 sdw_bus_master_delete(&amd_manager->bus); in amd_sdw_manager_remove()
984 ret = amd_disable_sdw_manager(amd_manager); in amd_sdw_manager_remove()
989 static int amd_sdw_clock_stop(struct amd_sdw_manager *amd_manager) in amd_sdw_clock_stop() argument
994 ret = sdw_bus_prep_clk_stop(&amd_manager->bus); in amd_sdw_clock_stop()
996 dev_err(amd_manager->dev, "prepare clock stop failed %d", ret); in amd_sdw_clock_stop()
999 ret = sdw_bus_clk_stop(&amd_manager->bus); in amd_sdw_clock_stop()
1001 dev_err(amd_manager->dev, "bus clock stop failed %d", ret); in amd_sdw_clock_stop()
1005 ret = readl_poll_timeout(amd_manager->mmio + ACP_SW_CLK_RESUME_CTRL, val, in amd_sdw_clock_stop()
1008 dev_err(amd_manager->dev, "SDW%x clock stop failed\n", amd_manager->instance); in amd_sdw_clock_stop()
1012 amd_manager->clk_stopped = true; in amd_sdw_clock_stop()
1013 if (amd_manager->wake_en_mask) in amd_sdw_clock_stop()
1014 writel(0x01, amd_manager->acp_mmio + ACP_SW_WAKE_EN(amd_manager->instance)); in amd_sdw_clock_stop()
1016 dev_dbg(amd_manager->dev, "SDW%x clock stop successful\n", amd_manager->instance); in amd_sdw_clock_stop()
1020 static int amd_sdw_clock_stop_exit(struct amd_sdw_manager *amd_manager) in amd_sdw_clock_stop_exit() argument
1025 if (amd_manager->clk_stopped) { in amd_sdw_clock_stop_exit()
1026 val = readl(amd_manager->mmio + ACP_SW_CLK_RESUME_CTRL); in amd_sdw_clock_stop_exit()
1028 writel(val, amd_manager->mmio + ACP_SW_CLK_RESUME_CTRL); in amd_sdw_clock_stop_exit()
1029 ret = readl_poll_timeout(amd_manager->mmio + ACP_SW_CLK_RESUME_CTRL, val, in amd_sdw_clock_stop_exit()
1033 writel(0, amd_manager->mmio + ACP_SW_CLK_RESUME_CTRL); in amd_sdw_clock_stop_exit()
1034 ret = sdw_bus_exit_clk_stop(&amd_manager->bus); in amd_sdw_clock_stop_exit()
1036 dev_err(amd_manager->dev, "bus failed to exit clock stop %d\n", in amd_sdw_clock_stop_exit()
1038 amd_manager->clk_stopped = false; in amd_sdw_clock_stop_exit()
1041 if (amd_manager->clk_stopped) { in amd_sdw_clock_stop_exit()
1042 dev_err(amd_manager->dev, "SDW%x clock stop exit failed\n", amd_manager->instance); in amd_sdw_clock_stop_exit()
1045 dev_dbg(amd_manager->dev, "SDW%x clock stop exit successful\n", amd_manager->instance); in amd_sdw_clock_stop_exit()
1072 struct amd_sdw_manager *amd_manager = dev_get_drvdata(dev); in amd_pm_prepare() local
1073 struct sdw_bus *bus = &amd_manager->bus; in amd_pm_prepare()
1086 if (amd_manager->power_mode_mask & AMD_SDW_CLK_STOP_MODE) { in amd_pm_prepare()
1106 struct amd_sdw_manager *amd_manager = dev_get_drvdata(dev); in amd_suspend() local
1107 struct sdw_bus *bus = &amd_manager->bus; in amd_suspend()
1116 if (amd_manager->power_mode_mask & AMD_SDW_CLK_STOP_MODE) { in amd_suspend()
1117 return amd_sdw_clock_stop(amd_manager); in amd_suspend()
1118 } else if (amd_manager->power_mode_mask & AMD_SDW_POWER_OFF_MODE) { in amd_suspend()
1123 ret = amd_sdw_clock_stop(amd_manager); in amd_suspend()
1126 return amd_deinit_sdw_manager(amd_manager); in amd_suspend()
1133 struct amd_sdw_manager *amd_manager = dev_get_drvdata(dev); in amd_suspend_runtime() local
1134 struct sdw_bus *bus = &amd_manager->bus; in amd_suspend_runtime()
1142 if (amd_manager->power_mode_mask & AMD_SDW_CLK_STOP_MODE) { in amd_suspend_runtime()
1143 return amd_sdw_clock_stop(amd_manager); in amd_suspend_runtime()
1144 } else if (amd_manager->power_mode_mask & AMD_SDW_POWER_OFF_MODE) { in amd_suspend_runtime()
1145 ret = amd_sdw_clock_stop(amd_manager); in amd_suspend_runtime()
1148 return amd_deinit_sdw_manager(amd_manager); in amd_suspend_runtime()
1155 struct amd_sdw_manager *amd_manager = dev_get_drvdata(dev); in amd_resume_runtime() local
1156 struct sdw_bus *bus = &amd_manager->bus; in amd_resume_runtime()
1166 if (amd_manager->power_mode_mask & AMD_SDW_CLK_STOP_MODE) { in amd_resume_runtime()
1167 return amd_sdw_clock_stop_exit(amd_manager); in amd_resume_runtime()
1168 } else if (amd_manager->power_mode_mask & AMD_SDW_POWER_OFF_MODE) { in amd_resume_runtime()
1169 val = readl(amd_manager->mmio + ACP_SW_CLK_RESUME_CTRL); in amd_resume_runtime()
1172 writel(val, amd_manager->mmio + ACP_SW_CLK_RESUME_CTRL); in amd_resume_runtime()
1173 ret = readl_poll_timeout(amd_manager->mmio + ACP_SW_CLK_RESUME_CTRL, val, in amd_resume_runtime()
1177 writel(0, amd_manager->mmio + ACP_SW_CLK_RESUME_CTRL); in amd_resume_runtime()
1178 amd_manager->clk_stopped = false; in amd_resume_runtime()
1182 amd_init_sdw_manager(amd_manager); in amd_resume_runtime()
1183 amd_enable_sdw_interrupts(amd_manager); in amd_resume_runtime()
1184 ret = amd_enable_sdw_manager(amd_manager); in amd_resume_runtime()
1187 amd_sdw_set_frameshape(amd_manager); in amd_resume_runtime()