static int kempld_get_info_generic(struct kempld_device_data *pld) { u16 version; u8 spec; kempld_get_mutex(pld); version = kempld_read16(pld, KEMPLD_VERSION); spec = kempld_read8(pld, KEMPLD_SPEC); pld->info.buildnr = kempld_read16(pld, KEMPLD_BUILDNR); pld->info.minor = KEMPLD_VERSION_GET_MINOR(version); pld->info.major = KEMPLD_VERSION_GET_MAJOR(version); pld->info.number = KEMPLD_VERSION_GET_NUMBER(version); pld->info.type = KEMPLD_VERSION_GET_TYPE(version); if (spec == 0xff) { pld->info.spec_minor = 0; pld->info.spec_major = 1; } else { pld->info.spec_minor = KEMPLD_SPEC_GET_MINOR(spec); pld->info.spec_major = KEMPLD_SPEC_GET_MAJOR(spec); } if (pld->info.spec_major > 0) pld->feature_mask = kempld_read16(pld, KEMPLD_FEATURE); else pld->feature_mask = 0; kempld_release_mutex(pld); return 0; }
static int kempld_gpio_pincount(struct kempld_device_data *pld) { u16 evt, evt_back; kempld_get_mutex(pld); /* Backup event register as it might be already initialized */ evt_back = kempld_read16(pld, KEMPLD_GPIO_EVT_LVL_EDGE); /* Clear event register */ kempld_write16(pld, KEMPLD_GPIO_EVT_LVL_EDGE, 0x0000); /* Read back event register */ evt = kempld_read16(pld, KEMPLD_GPIO_EVT_LVL_EDGE); /* Restore event register */ kempld_write16(pld, KEMPLD_GPIO_EVT_LVL_EDGE, evt_back); kempld_release_mutex(pld); return evt ? __ffs(evt) : 16; }
/** * kempld_read32 - read 32 bit register * @pld: kempld_device_data structure describing the PLD * @index: register index on the chip * * kempld_get_mutex must be called prior to calling this function. */ u32 kempld_read32(struct kempld_device_data *pld, u8 index) { return kempld_read16(pld, index) | kempld_read16(pld, index + 2) << 16; }