示例#1
0
文件: pm.c 项目: hugh712/Jollen
static int
pminfo_proc_output(char *buf)
{
	char *p;
	struct pm_dev *dev;

	p = buf;
	p += sprintf(p, "type \t\t id \t\t stat \t prev_state \n");
	p += sprintf(p, "----------------------------------------------\n");

	dev = NULL;

	while ((dev = pm_find(PM_UNKNOWN_DEV, dev)) != NULL) {
		switch (dev->type) {
		case PM_SYS_DEV:
			p += sprintf(p, "PM_SYS_DEV \t ");
			break;
		case PM_PCI_DEV:
			p += sprintf(p, "PM_PCI_DEV \t ");
			break;
		case PM_USB_DEV:
			p += sprintf(p, "PM_USB_DEV \t ");
			break;
		case PM_SCSI_DEV:
			p += sprintf(p, "PM_SCSI_DEV \t ");
			break;
		case PM_ISA_DEV:
			p += sprintf(p, "PM_ISA_DEV \t ");
			break;
		case PM_MTD_DEV:
			p += sprintf(p, "PM_MTD_DEV \t ");
			break;
		case PM_ILLUMINATION_DEV:
			p += sprintf(p, "PM_ILLUMINATION_DEV \t ");
			break;
		case PM_USER_DEV:
			p += sprintf(p, "PM_USER_DEV \t ");
			break;
		case PM_DEBUG_DEV:
			p += sprintf(p, "PM_DEBUG_DEV \t ");
			break;
		case PM_GP_DEV:
			p += sprintf(p, "PM_GP_DEV \t ");
			break;
		default:
			p += sprintf(p, "PM_UNKONWN_DEV \t ");
			break;
		}

		switch (dev->id) {
		case PM_SYS_KBC:
			p += sprintf(p, "PM_SYS_KBC \t ");
			break;
		case PM_SYS_COM:
			p += sprintf(p, "PM_SYS_COM \t ");
			break;
		case PM_SYS_IRDA:
			p += sprintf(p, "PM_SYS_IRDA \t ");
			break;
		case PM_SYS_FDC:
			p += sprintf(p, "PM_SYS_FDC \t ");
			break;
		case PM_SYS_VGA:
			p += sprintf(p, "PM_SYS_VGA \t ");
			break;
		case PM_SYS_PCMCIA:
			p += sprintf(p, "PM_SYS_PCMCIA \t ");
			break;
		case PM_USER_LCD:
			p += sprintf(p, "PM_USER_LCD \t ");
			break;
		case PM_USER_LIGHT:
			p += sprintf(p, "PM_USER_LIGHT \t ");
			break;
		case PM_USER_INPUT:
			p += sprintf(p, "PM_USER_INPUT \t ");
			break;
		case PM_DEBUG_0:
			p += sprintf(p, "PM_DEBUG_0 \t ");
			break;
		case PM_DEBUG_1:
			p += sprintf(p, "PM_DEBUG_1 \t ");
			break;
		case PM_DEBUG_2:
			p += sprintf(p, "PM_DEBUG_2 \t ");
			break;
		case PM_SYS_MISC:
			p += sprintf(p, "PM_SYS_MISC \t ");
			break;
		default:
			p += sprintf(p, "PM_UNKONWN_DEV \t ");
			break;
		}
		p += sprintf(p, "%d \t %d\n", (int)dev->state, (int)dev->prev_state);
	}

	return p - buf;

}
示例#2
0
static int do_ioctl(struct inode * inode, struct file *filp,
		    u_int cmd, u_long arg)
{
	struct apm_user *	as;
	struct pm_dev *		pm;
	struct ipm_config	conf;

	as = filp->private_data;
	if (check_apm_user(as, "ioctl"))
		return -EIO;

	memset(&conf, 0, sizeof(conf));

	switch (cmd) {
        case APM_IOC_SUSPEND:
		pm_do_suspend(CPUMODE_SLEEP);
		break;
        case APM_IOC_SET_WAKEUP:
		if ((pm = pm_find((pm_dev_t)arg,NULL)) == NULL)
			return -EINVAL;
		pm_send(pm,PM_SET_WAKEUP,NULL);
		break;
	case APM_IOC_SLEEP:
		pm_go_sleep(arg);
		break;
	case APM_IOC_SET_SPROF_WIN:
		sleep_to = arg * HZ;
		APM_DPRINTK("do_ioctl: sleep timeout %ld\n", arg);
		break;
	case APM_IOC_WAKEUP_ENABLE:
		PWER |= arg;
		APM_DPRINTK("do_ioctl: enable wakeup source:PWER=0x%x\n", PWER);
		break;
	case APM_IOC_WAKEUP_DISABLE:
		PWER &= ~arg;
		APM_DPRINTK("do_ioctl: disable wakeup source:PWER=0x%x\n", PWER);
		break;
	case APM_IOC_POWEROFF:
		APM_DPRINTK("do_ioctl: do power off\n");
		/* here all device should response ok */
		pm_send_all(PM_SUSPEND, (void *)3);
		pm_do_poweroff();
		pm_send_all(PM_RESUME, (void *)0);
		break;
	case APM_IOC_RESET_BP:
		APM_DPRINTK("do_ioctl: reset bp\n");
		GPCR(GPIO_BB_RESET) = GPIO_bit(GPIO_BB_RESET);
		mdelay(1);
		GPSR(GPIO_BB_RESET) = GPIO_bit(GPIO_BB_RESET);
		break;
	case APM_IOC_USEROFF_ENABLE:
		APM_DPRINTK("do_ioctl: useroff support enable\n");
		user_off_available = (int)arg;
		break;
	case APM_IOC_NOTIFY_BP:
                break;
        case APM_IOC_REFLASH:
                cpu_proc_fin();
                *(unsigned long *)(phys_to_virt(FLAG_ADDR)) = REFLASH_FLAG;

//		power_ic_periph_set_usb_pull_up(0);
//LIN           mdelay(1000);
//LIN let GPIO control the connectivity
#include <linux/power_ic.h>
		set_GPIO_mode(GPIO_USB_READY|GPIO_OUT);
		clr_GPIO(GPIO_USB_READY);
		power_ic_periph_set_usb_pull_up(0);
		mdelay(10);
		power_ic_set_reg_bit(POWER_IC_REG_EOC_CONN_CONTROL,19,1);//LIN set USB_CNTRL(bit19) to disable emu control
		mdelay(1000);
//LIN		power_ic_periph_set_usb_pull_up(1);

                /* Initialize the watchdog and let it fire */
                OWER = OWER_WME;
                OSSR = OSSR_M3;
		OSMR3 = OSCR + CLOCK_TICK_RATE/100;	/* ... in 10 ms */
                MDREFR |= MDREFR_SLFRSH;
		while(1);
                break;
        case APM_IOC_PASSTHRU:
                cpu_proc_fin();
                *(unsigned long *)(phys_to_virt(FLAG_ADDR)) = PASS_THRU_FLAG;

		power_ic_periph_set_usb_pull_up(0);
                mdelay(1000);
		power_ic_periph_set_usb_pull_up(1);

                /* Initialize the watchdog and let it fire */
                OWER = OWER_WME;
                OSSR = OSSR_M3;
		OSMR3 = OSCR + CLOCK_TICK_RATE/100;	/* ... in 10 ms */
                MDREFR |= MDREFR_SLFRSH;
		while(1);
                break;
	case APM_IOC_SET_IPROF_WIN:
		/* set profile window size */
		break;
	case APM_IOC_STARTPMU:
		if( pipm_start_pmu !=NULL )
			pipm_start_pmu();
		break;
	case APM_IOC_GET_IPM_CONFIG:
		get_ipm_config(&conf);
		return (copy_to_user((void *)arg, &conf,sizeof(conf)))? -EFAULT:0;
		break;
	case APM_IOC_SET_IPM_CONFIG:
		if(copy_from_user(&conf,(void *)arg,sizeof(conf)))
			return -EFAULT;
		
		return set_ipm_config(&conf);
		break;
	default:
		return -EINVAL;
	}
	return 0;
}