static long spi_boot_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { int ret = 0; struct modem_firmware img; struct modem_boot_spi *loader = filp->private_data; mutex_lock(&loader->lock); switch (cmd) { case IOCTL_MODEM_XMIT_BOOT: ret = copy_from_user(&img, (const void __user *)arg, sizeof(struct modem_firmware)); if (ret) { mif_err("ERR! copy_from_user fail (err %d)\n", ret); ret = -EFAULT; goto exit_err; } mif_info("IOCTL_MODEM_XMIT_BOOT (size %d)\n", img.size); ret = spi_boot_write(loader, img.binary, img.size); if (ret < 0) { mif_err("ERR! spi_boot_write fail (err %d)\n", ret); break; } if (!loader->gpio_cp_status) break; ret = check_cp_status(loader->gpio_cp_status, 100); if (ret < 0) { mif_err("ERR! check_cp_status fail (err %d)\n", ret); c2c_reload(); } break; default: mif_err("ioctl cmd error\n"); ret = -ENOIOCTLCMD; break; } mutex_unlock(&loader->lock); exit_err: return ret; }
static int ss222_dump_reset(struct modem_ctl *mc) { unsigned int gpio_cp_reset = mc->gpio_cp_reset; mif_err("+++\n"); if (!wake_lock_active(&mc->mc_wake_lock)) wake_lock(&mc->mc_wake_lock); gpio_set_value(gpio_cp_reset, 0); udelay(200); gpio_set_value(gpio_cp_reset, 1); #if 0 c2c_reload(); #endif msleep(300); mif_err("---\n"); return 0; }
static int ss222_on(struct modem_ctl *mc) { struct link_device *ld = get_current_link(mc->iod); int cp_on = gpio_get_value(mc->gpio_cp_on); int cp_off = gpio_get_value(mc->gpio_cp_off); int cp_reset = gpio_get_value(mc->gpio_cp_reset); int cp_active = gpio_get_value(mc->gpio_phone_active); int cp_status = gpio_get_value(mc->gpio_cp_status); mif_err("+++\n"); mif_err("cp_on:%d cp_reset:%d ps_hold:%d cp_active:%d cp_status:%d\n", cp_on, cp_reset, cp_off, cp_active, cp_status); gpio_set_value(mc->gpio_pda_active, 1); if (!wake_lock_active(&mc->mc_wake_lock)) wake_lock(&mc->mc_wake_lock); mc->phone_state = STATE_OFFLINE; ld->mode = LINK_MODE_OFFLINE; /* Make PS_HOLD_OFF floating (Hi-Z) for CP ON */ make_gpio_floating(mc->gpio_cp_off, true); gpio_set_value(mc->gpio_cp_on, 0); msleep(100); gpio_set_value(mc->gpio_cp_reset, 0); msleep(500); gpio_set_value(mc->gpio_cp_on, 1); msleep(100); gpio_set_value(mc->gpio_cp_reset, 1); #if 0 c2c_reload(); #endif msleep(300); mif_err("---\n"); return 0; }