static irqreturn_t cp_idpram_irq_handler(int irq, void *data) { struct dpram_link_device *dpld = (struct dpram_link_device *)data; struct link_device *ld = (struct link_device *)&dpld->ld; u16 int2ap; if (unlikely(ld->mode == LINK_MODE_OFFLINE)) return IRQ_HANDLED; if (dpram_wake_up(dpld) < 0) { log_dpram_status(dpld); trigger_force_cp_crash(dpld); return IRQ_HANDLED; } int2ap = recv_intr(dpld); dpram_intr_handler(dpld, int2ap); clear_intr(dpld); dpram_allow_sleep(dpld); return IRQ_HANDLED; }
static irqreturn_t dpram_irq_handler(int irq, void *data) { struct dpram_link_device *dpld = (struct dpram_link_device *)data; struct link_device *ld = (struct link_device *)&dpld->ld; u16 int2ap = 0; if (unlikely(ld->mode == LINK_MODE_OFFLINE)) return IRQ_HANDLED; if (dpram_wake_up(dpld) < 0) { log_dpram_status(dpld); trigger_force_cp_crash(dpld); return IRQ_HANDLED; } int2ap = recv_intr(dpld); if (unlikely(int2ap == INT_POWERSAFE_FAIL)) { mif_info("%s: int2ap == INT_POWERSAFE_FAIL\n", ld->name); goto exit; } else if (int2ap == 0x1234 || int2ap == 0xDBAB || int2ap == 0xABCD) { if (dpld->ext_op && dpld->ext_op->dload_cmd_handler) { dpld->ext_op->dload_cmd_handler(dpld, int2ap); goto exit; } } if (unlikely(EXT_UDL_CMD(int2ap))) { if (likely(EXT_INT_VALID(int2ap))) { if (UDL_CMD_VALID(int2ap)) udl_command_handler(dpld, int2ap); else if (EXT_CMD_VALID(int2ap)) ext_command_handler(dpld, int2ap); else mif_info("%s: ERR! invalid intr 0x%04X\n", ld->name, int2ap); } else { mif_info("%s: ERR! invalid intr 0x%04X\n", ld->name, int2ap); } } else { if (likely(INT_VALID(int2ap))) { if (unlikely(INT_CMD_VALID(int2ap))) command_handler(dpld, int2ap); else non_command_handler(dpld, int2ap); } else { mif_info("%s: ERR! invalid intr 0x%04X\n", ld->name, int2ap); } } exit: clear_intr(dpld); dpram_allow_sleep(dpld); return IRQ_HANDLED; }
static void printer_flushing(void) { clear_intr(); /* don't catch SIGINT */ tty_flush(); /* empty tty input and output queues */ block_write(&eofc, 1); /* send an EOF to the printer */ proc_upto_eof(1); /* this call won't be recursive, since we specify to ignore input */ get_page(&end_page); do_acct(); exit(EXIT_SUCCESS); }
static int dpram_ioctl(struct link_device *ld, struct io_device *iod, unsigned int cmd, unsigned long arg) { int err = -EFAULT; struct dpram_link_device *dpld = to_dpram_link_device(ld); mif_info("%s: cmd 0x%08X\n", ld->name, cmd); switch (cmd) { case IOCTL_DPRAM_SEND_BOOT: if (dpld->ext_op && dpld->ext_op->download_boot) { err = dpld->ext_op->download_boot(dpld, (void *)arg); if (err < 0) { mif_info("%s: ERR! download_boot fail\n", ld->name); goto exit; } } break; case IOCTL_DPRAM_PHONE_POWON: if (dpld->ext_op && dpld->ext_op->prepare_download) { err = dpld->ext_op->prepare_download(dpld); if (err < 0) { mif_info("%s: ERR! prepare_download fail\n", ld->name); goto exit; } } break; case IOCTL_DPRAM_PHONEIMG_LOAD: if (dpld->ext_op && dpld->ext_op->download_bin) { err = dpld->ext_op->download_bin(dpld, (void *)arg); if (err < 0) { mif_info("%s: ERR! download_bin fail\n", ld->name); goto exit; } } break; case IOCTL_DPRAM_NVDATA_LOAD: if (dpld->ext_op && dpld->ext_op->download_nv) { err = dpld->ext_op->download_nv(dpld, (void *)arg); if (err < 0) { mif_info("%s: ERR! download_nv fail\n", ld->name); goto exit; } } break; case IOCTL_DPRAM_PHONE_BOOTSTART: if (dpld->ext_op && dpld->ext_op->cp_boot_start) { err = dpld->ext_op->cp_boot_start(dpld); if (err < 0) { mif_info("%s: ERR! cp_boot_start fail\n", ld->name); goto exit; } } if (dpld->ext_op && dpld->ext_op->cp_boot_post_process) { err = dpld->ext_op->cp_boot_post_process(dpld); if (err < 0) { mif_info("%s: ERR! cp_boot_post_process fail\n", ld->name); goto exit; } } break; case IOCTL_DPRAM_PHONE_UPLOAD_STEP1: disable_irq_nosync(dpld->irq); if (dpld->ext_op && dpld->ext_op->upload_step1) { err = dpld->ext_op->upload_step1(dpld); if (err < 0) { clear_intr(dpld); enable_irq(dpld->irq); mif_info("%s: ERR! upload_step1 fail\n", ld->name); goto exit; } } break; case IOCTL_DPRAM_PHONE_UPLOAD_STEP2: if (dpld->ext_op->upload_step2) { err = dpld->ext_op->upload_step2(dpld, (void *)arg); if (err < 0) { clear_intr(dpld); enable_irq(dpld->irq); mif_info("%s: ERR! upload_step2 fail\n", ld->name); goto exit; } } break; case IOCTL_DPRAM_INIT_STATUS: mif_debug("%s: get dpram init status\n", ld->name); return dpld->dpram_init_status; case IOCTL_MODEM_DL_START: err = dpram_set_dload_magic(ld, iod); if (err < 0) { mif_info("%s: ERR! dpram_set_dload_magic fail\n", ld->name); goto exit; } default: break; } return 0; exit: return err; }