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(®, (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. ®.val ret = d2083_reg_read(d2083, reg.reg, ®_val); reg.val = (unsigned short)reg_val; if (copy_to_user((pmu_reg *)arg, ®, sizeof(pmu_reg)) != 0) return -EFAULT; break; case BCM_PMU_IOCTL_WRITE_REG: if (copy_from_user(®, (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; }