int rtc_read_datetime(struct tm *tm) { unsigned int i; int rc, oldlevel; unsigned char buf[7]; oldlevel = disable_irq_save(); if (get_pmu_type() == PCF50606) rc = pcf50606_read_multiple(PCF5060X_RTCSC, buf, sizeof(buf)); else rc = pcf50635_read_multiple(PCF5063X_REG_RTCSC, buf, sizeof(buf)); restore_irq(oldlevel); for (i = 0; i < sizeof(buf); i++) buf[i] = BCD2DEC(buf[i]); tm->tm_sec = buf[0]; tm->tm_min = buf[1]; tm->tm_hour = buf[2]; tm->tm_wday = buf[3]; tm->tm_mday = buf[4]; tm->tm_mon = buf[5] - 1; tm->tm_year = buf[6] + 100; return rc; }
void EXT3(void) { if (get_pmu_type() == PCF50606) { unsigned char data[3]; /* 0 = INT1, 1 = INT2, 2 = INT3 */ /* Clear pending interrupts from pcf50606 */ pcf50606_read_multiple(0x02, data, 3); if (data[0] & 0x04) { /* ONKEY1S */ if (!charger_inserted()) sys_poweroff(); else pcf50606_reset_timeout(); } if (data[2] & 0x08) { /* Touchscreen event, do something about it */ touchscreen_handle_device_irq(); } } else { unsigned char data[5]; /* 0 = INT1, 1 = INT2, 2 = INT3, ... 4 = INT5 */ /* Clear pending interrupts from pcf50635 */ pcf50635_read_multiple(PCF5063X_REG_INT1, data, 5); if (data[2] & PCF5063X_INT3_ONKEY1S) { if (!charger_inserted()) sys_poweroff(); } } }
void power_init(void) { /* Configure GPA6 as input and wait a short while */ GPIOA_DIR &= ~(1<<6); udelay(10); /* Value of GPA6 determines PMU chip type */ if (GPIOA & (1<<6)) { pmu = PCF50635; pcf50635_init(); /* Clear pending interrupts from pcf50635 */ unsigned char data[5]; /* 0 = INT1, 1 = INT2, 2 = INT3, ... 4 = INT5 */ pcf50635_read_multiple(PCF5063X_REG_INT1, data, 5); } else { pmu = PCF50606; /* Configure GPA6 for output (backlight enable) */ GPIOA_DIR |= (1<<6); pcf50606_init(); /* Clear pending interrupts */ unsigned char data[3]; /* 0 = INT1, 1 = INT2, 2 = INT3 */ pcf50606_read_multiple(0x02, data, 3); } #ifndef BOOTLOADER IEN |= EXT3_IRQ_MASK; /* Unmask EXT3 */ #endif }