Lines Matching full:cmd
15 * - maybe avoid some data copies with i2c by directly using the smu cmd
69 u8 cmd; member
114 struct smu_cmd *cmd; in smu_start_cmd() local
120 cmd = list_entry(smu->cmd_list.next, struct smu_cmd, link); in smu_start_cmd()
121 smu->cmd_cur = cmd; in smu_start_cmd()
122 list_del(&cmd->link); in smu_start_cmd()
124 DPRINTK("SMU: starting cmd %x, %d bytes data\n", cmd->cmd, in smu_start_cmd()
125 cmd->data_len); in smu_start_cmd()
126 DPRINTK("SMU: data buffer: %8ph\n", cmd->data_buf); in smu_start_cmd()
129 smu->cmd_buf->cmd = cmd->cmd; in smu_start_cmd()
130 smu->cmd_buf->length = cmd->data_len; in smu_start_cmd()
131 memcpy(smu->cmd_buf->data, cmd->data_buf, cmd->data_len); in smu_start_cmd()
165 struct smu_cmd *cmd; in smu_db_intr() local
166 void (*done)(struct smu_cmd *cmd, void *misc) = NULL; in smu_db_intr()
182 cmd = smu->cmd_cur; in smu_db_intr()
184 if (cmd == NULL) in smu_db_intr()
201 ack = (~cmd->cmd) & 0xff; in smu_db_intr()
202 if (ack != smu->cmd_buf->cmd) { in smu_db_intr()
204 ack, smu->cmd_buf->cmd); in smu_db_intr()
209 if (reply_len > cmd->reply_len) { in smu_db_intr()
212 reply_len, cmd->reply_len); in smu_db_intr()
213 reply_len = cmd->reply_len; in smu_db_intr()
215 cmd->reply_len = reply_len; in smu_db_intr()
216 if (cmd->reply_buf && reply_len) in smu_db_intr()
217 memcpy(cmd->reply_buf, smu->cmd_buf->data, reply_len); in smu_db_intr()
223 done = cmd->done; in smu_db_intr()
224 misc = cmd->misc; in smu_db_intr()
226 cmd->status = rc; in smu_db_intr()
238 done(cmd, misc); in smu_db_intr()
264 int smu_queue_cmd(struct smu_cmd *cmd) in smu_queue_cmd() argument
270 if (cmd->data_len > SMU_MAX_DATA || in smu_queue_cmd()
271 cmd->reply_len > SMU_MAX_DATA) in smu_queue_cmd()
274 cmd->status = 1; in smu_queue_cmd()
276 list_add_tail(&cmd->link, &smu->cmd_list); in smu_queue_cmd()
283 smu_spinwait_cmd(cmd); in smu_queue_cmd()
292 void (*done)(struct smu_cmd *cmd, void *misc), in smu_queue_simple() argument
295 struct smu_cmd *cmd = &scmd->cmd; in smu_queue_simple() local
303 cmd->cmd = command; in smu_queue_simple()
304 cmd->data_len = data_len; in smu_queue_simple()
305 cmd->data_buf = scmd->buffer; in smu_queue_simple()
306 cmd->reply_len = sizeof(scmd->buffer); in smu_queue_simple()
307 cmd->reply_buf = scmd->buffer; in smu_queue_simple()
308 cmd->done = done; in smu_queue_simple()
309 cmd->misc = misc; in smu_queue_simple()
316 return smu_queue_cmd(cmd); in smu_queue_simple()
335 void smu_done_complete(struct smu_cmd *cmd, void *misc) in smu_done_complete() argument
344 void smu_spinwait_cmd(struct smu_cmd *cmd) in smu_spinwait_cmd() argument
346 while(cmd->status == 1) in smu_spinwait_cmd()
368 cmd_buf->cmd = 0x8e; in smu_fill_set_rtc_cmd()
383 struct smu_simple_cmd cmd; in smu_get_rtc_time() local
390 rc = smu_queue_simple(&cmd, SMU_CMD_RTC_COMMAND, 1, NULL, NULL, in smu_get_rtc_time()
394 smu_spinwait_simple(&cmd); in smu_get_rtc_time()
396 time->tm_sec = bcd2hex(cmd.buffer[0]); in smu_get_rtc_time()
397 time->tm_min = bcd2hex(cmd.buffer[1]); in smu_get_rtc_time()
398 time->tm_hour = bcd2hex(cmd.buffer[2]); in smu_get_rtc_time()
399 time->tm_wday = bcd2hex(cmd.buffer[3]); in smu_get_rtc_time()
400 time->tm_mday = bcd2hex(cmd.buffer[4]); in smu_get_rtc_time()
401 time->tm_mon = bcd2hex(cmd.buffer[5]) - 1; in smu_get_rtc_time()
402 time->tm_year = bcd2hex(cmd.buffer[6]) + 100; in smu_get_rtc_time()
410 struct smu_simple_cmd cmd; in smu_set_rtc_time() local
416 rc = smu_queue_simple(&cmd, SMU_CMD_RTC_COMMAND, 8, NULL, NULL, in smu_set_rtc_time()
427 smu_spinwait_simple(&cmd); in smu_set_rtc_time()
435 struct smu_simple_cmd cmd; in smu_shutdown() local
440 if (smu_queue_simple(&cmd, SMU_CMD_POWER_COMMAND, 9, NULL, NULL, in smu_shutdown()
443 smu_spinwait_simple(&cmd); in smu_shutdown()
451 struct smu_simple_cmd cmd; in smu_restart() local
456 if (smu_queue_simple(&cmd, SMU_CMD_POWER_COMMAND, 8, NULL, NULL, in smu_restart()
459 smu_spinwait_simple(&cmd); in smu_restart()
702 static void smu_i2c_complete_command(struct smu_i2c_cmd *cmd, int fail) in smu_i2c_complete_command() argument
704 void (*done)(struct smu_i2c_cmd *cmd, void *misc) = cmd->done; in smu_i2c_complete_command()
705 void *misc = cmd->misc; in smu_i2c_complete_command()
709 if (!fail && cmd->read) { in smu_i2c_complete_command()
710 if (cmd->pdata[0] < 1) in smu_i2c_complete_command()
713 memcpy(cmd->info.data, &cmd->pdata[1], in smu_i2c_complete_command()
714 cmd->info.datalen); in smu_i2c_complete_command()
726 cmd->status = fail ? -EIO : 0; in smu_i2c_complete_command()
736 list_del(&cmd->link); in smu_i2c_complete_command()
739 list_add_tail(&cmd->scmd.link, &smu->cmd_list); in smu_i2c_complete_command()
747 done(cmd, misc); in smu_i2c_complete_command()
754 struct smu_i2c_cmd *cmd = smu->cmd_i2c_cur; in smu_i2c_retry() local
759 cmd->pdata[0] = 0xff; in smu_i2c_retry()
760 cmd->scmd.reply_len = sizeof(cmd->pdata); in smu_i2c_retry()
761 smu_queue_cmd(&cmd->scmd); in smu_i2c_retry()
767 struct smu_i2c_cmd *cmd = misc; in smu_i2c_low_completion() local
771 cmd->stage, scmd->status, cmd->pdata[0], scmd->reply_len); in smu_i2c_low_completion()
776 else if (cmd->read) { in smu_i2c_low_completion()
777 if (cmd->stage == 0) in smu_i2c_low_completion()
778 fail = cmd->pdata[0] != 0; in smu_i2c_low_completion()
780 fail = cmd->pdata[0] >= 0x80; in smu_i2c_low_completion()
782 fail = cmd->pdata[0] != 0; in smu_i2c_low_completion()
787 if (fail && --cmd->retries > 0) { in smu_i2c_low_completion()
789 BUG_ON(cmd != smu->cmd_i2c_cur); in smu_i2c_low_completion()
800 if (fail || cmd->stage != 0) { in smu_i2c_low_completion()
801 smu_i2c_complete_command(cmd, fail); in smu_i2c_low_completion()
808 scmd->reply_buf = cmd->pdata; in smu_i2c_low_completion()
809 scmd->reply_len = sizeof(cmd->pdata); in smu_i2c_low_completion()
810 scmd->data_buf = cmd->pdata; in smu_i2c_low_completion()
812 cmd->pdata[0] = 0; in smu_i2c_low_completion()
813 cmd->stage = 1; in smu_i2c_low_completion()
814 cmd->retries = 20; in smu_i2c_low_completion()
819 int smu_queue_i2c(struct smu_i2c_cmd *cmd) in smu_queue_i2c() argument
827 cmd->scmd.cmd = SMU_CMD_I2C_COMMAND; in smu_queue_i2c()
828 cmd->scmd.done = smu_i2c_low_completion; in smu_queue_i2c()
829 cmd->scmd.misc = cmd; in smu_queue_i2c()
830 cmd->scmd.reply_buf = cmd->pdata; in smu_queue_i2c()
831 cmd->scmd.reply_len = sizeof(cmd->pdata); in smu_queue_i2c()
832 cmd->scmd.data_buf = (u8 *)(char *)&cmd->info; in smu_queue_i2c()
833 cmd->scmd.status = 1; in smu_queue_i2c()
834 cmd->stage = 0; in smu_queue_i2c()
835 cmd->pdata[0] = 0xff; in smu_queue_i2c()
836 cmd->retries = 20; in smu_queue_i2c()
837 cmd->status = 1; in smu_queue_i2c()
842 cmd->info.caddr = cmd->info.devaddr; in smu_queue_i2c()
843 cmd->read = cmd->info.devaddr & 0x01; in smu_queue_i2c()
844 switch(cmd->info.type) { in smu_queue_i2c()
846 cmd->info.sublen = 0; in smu_queue_i2c()
847 memset(cmd->info.subaddr, 0, sizeof(cmd->info.subaddr)); in smu_queue_i2c()
850 cmd->info.devaddr &= 0xfe; in smu_queue_i2c()
853 if (cmd->info.sublen > 3) in smu_queue_i2c()
862 if (cmd->read) { in smu_queue_i2c()
863 if (cmd->info.datalen > SMU_I2C_READ_MAX) in smu_queue_i2c()
865 memset(cmd->info.data, 0xff, cmd->info.datalen); in smu_queue_i2c()
866 cmd->scmd.data_len = 9; in smu_queue_i2c()
868 if (cmd->info.datalen > SMU_I2C_WRITE_MAX) in smu_queue_i2c()
870 cmd->scmd.data_len = 9 + cmd->info.datalen; in smu_queue_i2c()
875 cmd->read ? "read" : "write", cmd->info.datalen, in smu_queue_i2c()
876 cmd->info.bus, cmd->info.caddr, in smu_queue_i2c()
877 cmd->info.subaddr[0], cmd->info.type); in smu_queue_i2c()
885 smu->cmd_i2c_cur = cmd; in smu_queue_i2c()
886 list_add_tail(&cmd->scmd.link, &smu->cmd_list); in smu_queue_i2c()
890 list_add_tail(&cmd->link, &smu->cmd_i2c_list); in smu_queue_i2c()
904 struct smu_cmd cmd; in smu_read_datablock() local
916 cmd.cmd = SMU_CMD_MISC_ee_COMMAND; in smu_read_datablock()
917 cmd.data_len = 7; in smu_read_datablock()
918 cmd.data_buf = params; in smu_read_datablock()
919 cmd.reply_len = chunk; in smu_read_datablock()
920 cmd.reply_buf = dest; in smu_read_datablock()
921 cmd.done = smu_done_complete; in smu_read_datablock()
922 cmd.misc = ∁ in smu_read_datablock()
928 rc = smu_queue_cmd(&cmd); in smu_read_datablock()
932 if (cmd.status != 0) in smu_read_datablock()
934 if (cmd.reply_len != clen) { in smu_read_datablock()
937 cmd.reply_len, clen); in smu_read_datablock()
950 struct smu_simple_cmd cmd; in smu_create_sdb_partition() local
957 smu_queue_simple(&cmd, SMU_CMD_PARTITION_COMMAND, 2, in smu_create_sdb_partition()
962 cmd.cmd.status, cmd.cmd.reply_len); in smu_create_sdb_partition()
965 if (cmd.cmd.status != 0 || cmd.cmd.reply_len != 6) in smu_create_sdb_partition()
969 addr = *((u16 *)cmd.buffer); in smu_create_sdb_partition()
970 len = cmd.buffer[3] << 2; in smu_create_sdb_partition()
1072 struct smu_cmd cmd; member
1102 static void smu_user_cmd_done(struct smu_cmd *cmd, void *misc) in smu_user_cmd_done() argument
1127 part = __smu_get_sdb_partition(hdr.cmd, NULL, 1); in smu_write()
1146 pp->cmd.status = 1; in smu_write()
1154 pp->cmd.cmd = hdr.cmd; in smu_write()
1155 pp->cmd.data_len = hdr.data_len; in smu_write()
1156 pp->cmd.reply_len = SMU_MAX_DATA; in smu_write()
1157 pp->cmd.data_buf = pp->buffer; in smu_write()
1158 pp->cmd.reply_buf = pp->buffer; in smu_write()
1159 pp->cmd.done = smu_user_cmd_done; in smu_write()
1160 pp->cmd.misc = pp; in smu_write()
1161 rc = smu_queue_cmd(&pp->cmd); in smu_write()
1181 if (pp->cmd.status == 1) { in smu_read_command()
1190 if (pp->cmd.status != 1) in smu_read_command()
1205 if (pp->cmd.status != 0) in smu_read_command()
1206 pp->cmd.reply_len = 0; in smu_read_command()
1207 size = sizeof(hdr) + pp->cmd.reply_len; in smu_read_command()
1211 hdr.status = pp->cmd.status; in smu_read_command()
1212 hdr.reply_len = pp->cmd.reply_len; in smu_read_command()
1259 if (pp->busy && pp->cmd.status != 1) in smu_fpoll()
1286 if (busy && pp->cmd.status == 1) { in smu_release()
1292 if (pp->cmd.status != 1) in smu_release()