/* make ec goto idle mode */ static int ec_init_idle_mode(void) { int timeout; unsigned char status = 0; int ret = 0; ec_query_seq(CMD_INIT_IDLE_MODE); /* make the action take active */ timeout = EC_CMD_TIMEOUT; status = ec_read(REG_POWER_MODE) & FLAG_IDLE_MODE; while (timeout--) { if (status) { udelay(EC_REG_DELAY); break; } status = ec_read(REG_POWER_MODE) & FLAG_IDLE_MODE; udelay(EC_REG_DELAY); } if (timeout <= 0) { printk(KERN_ERR "ec rom fixup : can't check out the status.\n"); ret = -EINVAL; } else printk(KERN_INFO "(%d/%d)0xf710 : 0x%x\n", timeout, EC_CMD_TIMEOUT - timeout, ec_read(REG_POWER_MODE)); printk(KERN_INFO "entering idle mode ok...................\n"); return ret; }
/* make ec goto idle mode */ int ec_init_idle_mode(void) { int timeout; unsigned char status = 0; int ret = 0; ec_query_seq(CMD_INIT_IDLE_MODE); /* make the action take active */ timeout = EC_CMD_TIMEOUT; status = rdec(REG_POWER_MODE) & FLAG_IDLE_MODE; while(timeout--){ if(status){ udelay(EC_REG_DELAY); break; } status = rdec(REG_POWER_MODE) & FLAG_IDLE_MODE; udelay(EC_REG_DELAY); } if(timeout <= 0){ printf("ec rom fixup : can't check idle status.\n"); ret = -1; } //printf("entering idle mode ok...................\n"); return ret; }
/* make ec exit from idle mode */ static int ec_exit_idle_mode(void) { ec_query_seq(CMD_EXIT_IDLE_MODE); printk(KERN_INFO "exit idle mode ok...................\n"); return 0; }
/* make ec exit from idle mode */ int ec_exit_idle_mode(void) { ec_query_seq(CMD_EXIT_IDLE_MODE); //printf("exit idle mode ok...................\n"); return 0; }
/* enable the chip reset mode */ static int ec_init_reset_mode(void) { int timeout; unsigned char status = 0; int ret = 0; /* make chip goto reset mode */ ret = ec_query_seq(CMD_INIT_RESET_MODE); if (ret < 0) { printk(KERN_ERR "ec init reset mode failed.\n"); goto out; } /* make the action take active */ timeout = EC_CMD_TIMEOUT; status = ec_read(REG_POWER_MODE) & FLAG_RESET_MODE; while (timeout--) { if (status) { udelay(EC_REG_DELAY); break; } status = ec_read(REG_POWER_MODE) & FLAG_RESET_MODE; udelay(EC_REG_DELAY); } if (timeout <= 0) { printk(KERN_ERR "ec rom fixup : can't check reset status.\n"); ret = -EINVAL; } else printk(KERN_INFO "(%d/%d)reset 0xf710 : 0x%x\n", timeout, EC_CMD_TIMEOUT - timeout, status); /* set MCU to reset mode */ udelay(EC_REG_DELAY); status = ec_read(REG_PXCFG); status |= (1 << 0); ec_write(REG_PXCFG, status); udelay(EC_REG_DELAY); /* disable FWH/LPC */ udelay(EC_REG_DELAY); status = ec_read(REG_LPCCFG); status &= ~(1 << 7); ec_write(REG_LPCCFG, status); udelay(EC_REG_DELAY); printk(KERN_INFO "entering reset mode ok..............\n"); out: return ret; }
/* enable the chip reset mode */ int ec_init_reset_mode(void) { int timeout; unsigned char status = 0; int ret = 0; /* make chip goto reset mode */ ret = ec_query_seq(CMD_INIT_RESET_MODE); if(ret < 0){ printf("ec init reset mode failed.\n"); goto out; } /* make the action take active */ timeout = EC_CMD_TIMEOUT; status = rdec(REG_POWER_MODE) & FLAG_RESET_MODE; while(timeout--){ if(status){ udelay(EC_REG_DELAY); break; } status = rdec(REG_POWER_MODE) & FLAG_RESET_MODE; udelay(EC_REG_DELAY); } if(timeout <= 0){ printf("ec rom fixup : can't check reset status.\n"); ret = -1; } /* set MCU to reset mode */ udelay(EC_REG_DELAY); status = rdec(REG_PXCFG); status |= (1 << 0); wrec(REG_PXCFG, status); udelay(EC_REG_DELAY); /* disable FWH/LPC */ udelay(EC_REG_DELAY); status = rdec(REG_LPCCFG); status &= ~(1 << 7); wrec(REG_LPCCFG, status); udelay(EC_REG_DELAY); //printf("entering reset mode ok..............\n"); out : return ret; }
int wakeup_loongson(void) { int irq; irq = mach_i8259_irq(); if (irq < 0) return 0; printk(KERN_INFO "%s: irq = %d\n", __func__, irq); if (irq == I8042_KBD_IRQ) return 1; else if (irq == SCI_IRQ_NUM) { int ret, sci_event; ret = ec_query_seq(CMD_GET_EVENT_NUM); if (ret < 0) return 0; sci_event = ec_get_event_num(); if (sci_event < 0) return 0; if (sci_event == EVENT_LID) { int lid_status; lid_status = ec_read(REG_LID_DETECT); if (lid_status == BIT_LID_DETECT_ON) { if (initialized == 0) { INIT_DELAYED_WORK(&lid_task, yeeloong_lid_update_task); initialized = 1; } schedule_delayed_work(&lid_task, 1); return 1; } } } return 0; }
/* * Send query command to EC to get the proper event number */ int ec_query_event_num(void) { return ec_query_seq(CMD_GET_EVENT_NUM); }
/* re-power the whole system for new ec firmware working correctly. */ void ec_reboot_system(void) { ec_query_seq(CMD_REBOOT_SYSTEM); //printf("reboot system...................\n"); }