Lines Matching refs:cmd

16  *  - maybe avoid some data copies with i2c by directly using the smu cmd
68 u8 cmd;
112 struct smu_cmd *cmd;
118 cmd = list_entry(smu->cmd_list.next, struct smu_cmd, link);
119 smu->cmd_cur = cmd;
120 list_del(&cmd->link);
122 DPRINTK("SMU: starting cmd %x, %d bytes data\n", cmd->cmd,
123 cmd->data_len);
124 DPRINTK("SMU: data buffer: %8ph\n", cmd->data_buf);
127 smu->cmd_buf->cmd = cmd->cmd;
128 smu->cmd_buf->length = cmd->data_len;
129 memcpy(smu->cmd_buf->data, cmd->data_buf, cmd->data_len);
163 struct smu_cmd *cmd;
164 void (*done)(struct smu_cmd *cmd, void *misc) = NULL;
180 cmd = smu->cmd_cur;
182 if (cmd == NULL)
199 ack = (~cmd->cmd) & 0xff;
200 if (ack != smu->cmd_buf->cmd) {
202 ack, smu->cmd_buf->cmd);
207 if (reply_len > cmd->reply_len) {
210 reply_len, cmd->reply_len);
211 reply_len = cmd->reply_len;
213 cmd->reply_len = reply_len;
214 if (cmd->reply_buf && reply_len)
215 memcpy(cmd->reply_buf, smu->cmd_buf->data, reply_len);
221 done = cmd->done;
222 misc = cmd->misc;
224 cmd->status = rc;
236 done(cmd, misc);
262 int smu_queue_cmd(struct smu_cmd *cmd)
268 if (cmd->data_len > SMU_MAX_DATA ||
269 cmd->reply_len > SMU_MAX_DATA)
272 cmd->status = 1;
274 list_add_tail(&cmd->link, &smu->cmd_list);
281 smu_spinwait_cmd(cmd);
290 void (*done)(struct smu_cmd *cmd, void *misc),
293 struct smu_cmd *cmd = &scmd->cmd;
301 cmd->cmd = command;
302 cmd->data_len = data_len;
303 cmd->data_buf = scmd->buffer;
304 cmd->reply_len = sizeof(scmd->buffer);
305 cmd->reply_buf = scmd->buffer;
306 cmd->done = done;
307 cmd->misc = misc;
314 return smu_queue_cmd(cmd);
333 void smu_done_complete(struct smu_cmd *cmd, void *misc)
342 void smu_spinwait_cmd(struct smu_cmd *cmd)
344 while(cmd->status == 1)
366 cmd_buf->cmd = 0x8e;
381 struct smu_simple_cmd cmd;
388 rc = smu_queue_simple(&cmd, SMU_CMD_RTC_COMMAND, 1, NULL, NULL,
392 smu_spinwait_simple(&cmd);
394 time->tm_sec = bcd2hex(cmd.buffer[0]);
395 time->tm_min = bcd2hex(cmd.buffer[1]);
396 time->tm_hour = bcd2hex(cmd.buffer[2]);
397 time->tm_wday = bcd2hex(cmd.buffer[3]);
398 time->tm_mday = bcd2hex(cmd.buffer[4]);
399 time->tm_mon = bcd2hex(cmd.buffer[5]) - 1;
400 time->tm_year = bcd2hex(cmd.buffer[6]) + 100;
408 struct smu_simple_cmd cmd;
414 rc = smu_queue_simple(&cmd, SMU_CMD_RTC_COMMAND, 8, NULL, NULL,
425 smu_spinwait_simple(&cmd);
433 struct smu_simple_cmd cmd;
438 if (smu_queue_simple(&cmd, SMU_CMD_POWER_COMMAND, 9, NULL, NULL,
441 smu_spinwait_simple(&cmd);
449 struct smu_simple_cmd cmd;
454 if (smu_queue_simple(&cmd, SMU_CMD_POWER_COMMAND, 8, NULL, NULL,
457 smu_spinwait_simple(&cmd);
702 static void smu_i2c_complete_command(struct smu_i2c_cmd *cmd, int fail)
704 void (*done)(struct smu_i2c_cmd *cmd, void *misc) = cmd->done;
705 void *misc = cmd->misc;
709 if (!fail && cmd->read) {
710 if (cmd->pdata[0] < 1)
713 memcpy(cmd->info.data, &cmd->pdata[1],
714 cmd->info.datalen);
726 cmd->status = fail ? -EIO : 0;
736 list_del(&cmd->link);
739 list_add_tail(&cmd->scmd.link, &smu->cmd_list);
747 done(cmd, misc);
754 struct smu_i2c_cmd *cmd = smu->cmd_i2c_cur;
759 cmd->pdata[0] = 0xff;
760 cmd->scmd.reply_len = sizeof(cmd->pdata);
761 smu_queue_cmd(&cmd->scmd);
767 struct smu_i2c_cmd *cmd = misc;
771 cmd->stage, scmd->status, cmd->pdata[0], scmd->reply_len);
776 else if (cmd->read) {
777 if (cmd->stage == 0)
778 fail = cmd->pdata[0] != 0;
780 fail = cmd->pdata[0] >= 0x80;
782 fail = cmd->pdata[0] != 0;
787 if (fail && --cmd->retries > 0) {
789 BUG_ON(cmd != smu->cmd_i2c_cur);
800 if (fail || cmd->stage != 0) {
801 smu_i2c_complete_command(cmd, fail);
808 scmd->reply_buf = cmd->pdata;
809 scmd->reply_len = sizeof(cmd->pdata);
810 scmd->data_buf = cmd->pdata;
812 cmd->pdata[0] = 0;
813 cmd->stage = 1;
814 cmd->retries = 20;
819 int smu_queue_i2c(struct smu_i2c_cmd *cmd)
827 cmd->scmd.cmd = SMU_CMD_I2C_COMMAND;
828 cmd->scmd.done = smu_i2c_low_completion;
829 cmd->scmd.misc = cmd;
830 cmd->scmd.reply_buf = cmd->pdata;
831 cmd->scmd.reply_len = sizeof(cmd->pdata);
832 cmd->scmd.data_buf = (u8 *)(char *)&cmd->info;
833 cmd->scmd.status = 1;
834 cmd->stage = 0;
835 cmd->pdata[0] = 0xff;
836 cmd->retries = 20;
837 cmd->status = 1;
842 cmd->info.caddr = cmd->info.devaddr;
843 cmd->read = cmd->info.devaddr & 0x01;
844 switch(cmd->info.type) {
846 memset(&cmd->info.sublen, 0, 4);
849 cmd->info.devaddr &= 0xfe;
851 if (cmd->info.sublen > 3)
860 if (cmd->read) {
861 if (cmd->info.datalen > SMU_I2C_READ_MAX)
863 memset(cmd->info.data, 0xff, cmd->info.datalen);
864 cmd->scmd.data_len = 9;
866 if (cmd->info.datalen > SMU_I2C_WRITE_MAX)
868 cmd->scmd.data_len = 9 + cmd->info.datalen;
873 cmd->read ? "read" : "write", cmd->info.datalen,
874 cmd->info.bus, cmd->info.caddr,
875 cmd->info.subaddr[0], cmd->info.type);
883 smu->cmd_i2c_cur = cmd;
884 list_add_tail(&cmd->scmd.link, &smu->cmd_list);
888 list_add_tail(&cmd->link, &smu->cmd_i2c_list);
902 struct smu_cmd cmd;
914 cmd.cmd = SMU_CMD_MISC_ee_COMMAND;
915 cmd.data_len = 7;
916 cmd.data_buf = params;
917 cmd.reply_len = chunk;
918 cmd.reply_buf = dest;
919 cmd.done = smu_done_complete;
920 cmd.misc = &comp;
926 rc = smu_queue_cmd(&cmd);
930 if (cmd.status != 0)
932 if (cmd.reply_len != clen) {
935 cmd.reply_len, clen);
948 struct smu_simple_cmd cmd;
955 smu_queue_simple(&cmd, SMU_CMD_PARTITION_COMMAND, 2,
960 cmd.cmd.status, cmd.cmd.reply_len);
963 if (cmd.cmd.status != 0 || cmd.cmd.reply_len != 6)
967 addr = *((u16 *)cmd.buffer);
968 len = cmd.buffer[3] << 2;
1070 struct smu_cmd cmd;
1100 static void smu_user_cmd_done(struct smu_cmd *cmd, void *misc)
1125 part = __smu_get_sdb_partition(hdr.cmd, NULL, 1);
1144 pp->cmd.status = 1;
1152 pp->cmd.cmd = hdr.cmd;
1153 pp->cmd.data_len = hdr.data_len;
1154 pp->cmd.reply_len = SMU_MAX_DATA;
1155 pp->cmd.data_buf = pp->buffer;
1156 pp->cmd.reply_buf = pp->buffer;
1157 pp->cmd.done = smu_user_cmd_done;
1158 pp->cmd.misc = pp;
1159 rc = smu_queue_cmd(&pp->cmd);
1179 if (pp->cmd.status == 1) {
1188 if (pp->cmd.status != 1)
1203 if (pp->cmd.status != 0)
1204 pp->cmd.reply_len = 0;
1205 size = sizeof(hdr) + pp->cmd.reply_len;
1209 hdr.status = pp->cmd.status;
1210 hdr.reply_len = pp->cmd.reply_len;
1257 if (pp->busy && pp->cmd.status != 1)
1284 if (busy && pp->cmd.status == 1) {
1290 if (pp->cmd.status != 1)