#include <sys/1394/targets/dcam1394/dcam_reg.h>
int
dcam_reg_read(dcam_state_t *soft_state, dcam1394_reg_io_t *arg)
{
cmd1394_cmd_t *cmdp;
if (t1394_alloc_cmd(soft_state->sl_handle, 1, &cmdp) != DDI_SUCCESS) {
return (-1);
}
cmdp->cmd_type = CMD1394_ASYNCH_RD_QUAD;
cmdp->cmd_addr = 0x0000FFFFF0F00000 |
(uint64_t)(arg->offs & 0x00000FFC);
cmdp->cmd_options = CMD1394_BLOCKING;
#ifdef GRAPHICS_DELAY
delay(drv_usectohz(500));
#endif
if (t1394_read(soft_state->sl_handle, cmdp) != DDI_SUCCESS) {
(void) t1394_free_cmd(soft_state->sl_handle, 0, &cmdp);
return (-1);
}
if (cmdp->cmd_result != DDI_SUCCESS) {
(void) t1394_free_cmd(soft_state->sl_handle, 0, &cmdp);
return (-1);
}
cmdp->cmd_u.q.quadlet_data = T1394_DATA32(cmdp->cmd_u.q.quadlet_data);
arg->val = cmdp->cmd_u.q.quadlet_data;
(void) t1394_free_cmd(soft_state->sl_handle, 0, &cmdp);
return (0);
}
int
dcam_reg_write(dcam_state_t *soft_state, dcam1394_reg_io_t *arg)
{
cmd1394_cmd_t *cmdp;
if (t1394_alloc_cmd(soft_state->sl_handle, 0, &cmdp) != DDI_SUCCESS) {
return (-1);
}
cmdp->cmd_type = CMD1394_ASYNCH_WR_QUAD;
cmdp->cmd_addr = 0x0000FFFFF0F00000 |
(uint64_t)(arg->offs & 0x00000FFC);
cmdp->cmd_options = CMD1394_BLOCKING;
cmdp->cmd_u.q.quadlet_data = T1394_DATA32(arg->val);
#ifdef GRAPHICS_DELAY
delay(drv_usectohz(500));
#endif
if (t1394_write(soft_state->sl_handle, cmdp) != DDI_SUCCESS) {
(void) t1394_free_cmd(soft_state->sl_handle, 0, &cmdp);
return (-1);
}
if (cmdp->cmd_result != DDI_SUCCESS) {
(void) t1394_free_cmd(soft_state->sl_handle, 0, &cmdp);
return (-1);
}
(void) t1394_free_cmd(soft_state->sl_handle, 0, &cmdp);
return (0);
}