Example #1
0
static inline int audio_read_block(int start_reg, int len, u8 *dest)
{
	return d2083_block_read(d2083, start_reg, len, dest);
}
static long d2083_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
	struct d2083 *d2083 =  file->private_data;
	pmu_reg reg;
	int ret = 0;
	u8 reg_val, event_reg[4];

	if (!d2083)
		return -ENOTTY;
		
	// _kg TODO: Checking if d2083_reg_write() and d2083_reg_read()
	// return with success. 
	switch (cmd) {
    	case BCM_PMU_IOCTL_ENABLE_INTS:
		ret = d2083_block_read(d2083, D2083_EVENTA_REG, 4, event_reg);
		dlg_info("int register 0x%X = 0x%X\n", D2083_EVENTA_REG, event_reg[0]);
		dlg_info("int register 0x%X = 0x%X\n", D2083_EVENTB_REG, event_reg[1]);
		dlg_info("int register 0x%X = 0x%X\n", D2083_EVENTC_REG, event_reg[2]);
		dlg_info("int register 0x%X = 0x%X\n", D2083_EVENTD_REG, event_reg[3]);

		/* Clear all latched interrupts if any */
		d2083_reg_write(d2083, D2083_EVENTA_REG, 0xFF);
		d2083_reg_write(d2083, D2083_EVENTB_REG, 0xFF);
		d2083_reg_write(d2083, D2083_EVENTC_REG, 0xFF);
		d2083_reg_write(d2083, D2083_EVENTD_REG, 0xFF);

		enable_irq(d2083->chip_irq);
		break;

    	case BCM_PMU_IOCTL_DISABLE_INTS:
		disable_irq_nosync(d2083->chip_irq);
		break;

    	case BCM_PMU_IOCTL_READ_REG:
		if (copy_from_user(&reg, (pmu_reg *)arg, sizeof(pmu_reg)) != 0)
			return -EFAULT;
		// DLG eric. 03/Nov/2011. Change prototype
		//reg.val = d2083_reg_read(d2083, reg.reg);
		// TODO: Check parameter. &reg.val
		ret = d2083_reg_read(d2083, reg.reg, &reg_val);
		reg.val = (unsigned short)reg_val;
		if (copy_to_user((pmu_reg *)arg, &reg, sizeof(pmu_reg)) != 0)
			return -EFAULT;
		break;

	case BCM_PMU_IOCTL_WRITE_REG:
		if (copy_from_user(&reg, (pmu_reg *)arg, sizeof(pmu_reg)) != 0)
			return -EFAULT;
		d2083_reg_write(d2083, reg.reg, (u8)reg.val);
		break;

#if 0
	case BCM_PMU_IOCTL_SET_VOLTAGE:
	case BCM_PMU_IOCTL_GET_VOLTAGE:
	case BCM_PMU_IOCTL_GET_REGULATOR_STATE:
	case BCM_PMU_IOCTL_SET_REGULATOR_STATE:
	case BCM_PMU_IOCTL_ACTIVATESIM:
	case BCM_PMU_IOCTL_DEACTIVATESIM:
		ret = d2083_ioctl_regulator(d2083, cmd, arg);
		break;
#endif
	case BCM_PMU_IOCTL_POWERONOFF:
		//    d2083_set_bits(d2083,D2083_POWERCONT_REG,D2083_POWERCONT_RTCAUTOEN);
		d2083_shutdown(d2083);
		break;

	default:
		dlg_err("%s: unsupported cmd\n", __func__);
		ret = -ENOTTY;
	}

	return ret;
}