Lines Matching refs:pld
28 static void kempld_get_hardware_mutex(struct kempld_device_data *pld) in kempld_get_hardware_mutex() argument
31 while (ioread8(pld->io_index) & KEMPLD_MUTEX_KEY) in kempld_get_hardware_mutex()
35 static void kempld_release_hardware_mutex(struct kempld_device_data *pld) in kempld_release_hardware_mutex() argument
38 iowrite8(KEMPLD_MUTEX_KEY, pld->io_index); in kempld_release_hardware_mutex()
41 static int kempld_get_info_generic(struct kempld_device_data *pld) in kempld_get_info_generic() argument
46 kempld_get_mutex(pld); in kempld_get_info_generic()
48 version = kempld_read16(pld, KEMPLD_VERSION); in kempld_get_info_generic()
49 spec = kempld_read8(pld, KEMPLD_SPEC); in kempld_get_info_generic()
50 pld->info.buildnr = kempld_read16(pld, KEMPLD_BUILDNR); in kempld_get_info_generic()
52 pld->info.minor = KEMPLD_VERSION_GET_MINOR(version); in kempld_get_info_generic()
53 pld->info.major = KEMPLD_VERSION_GET_MAJOR(version); in kempld_get_info_generic()
54 pld->info.number = KEMPLD_VERSION_GET_NUMBER(version); in kempld_get_info_generic()
55 pld->info.type = KEMPLD_VERSION_GET_TYPE(version); in kempld_get_info_generic()
58 pld->info.spec_minor = 0; in kempld_get_info_generic()
59 pld->info.spec_major = 1; in kempld_get_info_generic()
61 pld->info.spec_minor = KEMPLD_SPEC_GET_MINOR(spec); in kempld_get_info_generic()
62 pld->info.spec_major = KEMPLD_SPEC_GET_MAJOR(spec); in kempld_get_info_generic()
65 if (pld->info.spec_major > 0) in kempld_get_info_generic()
66 pld->feature_mask = kempld_read16(pld, KEMPLD_FEATURE); in kempld_get_info_generic()
68 pld->feature_mask = 0; in kempld_get_info_generic()
70 kempld_release_mutex(pld); in kempld_get_info_generic()
99 static int kempld_register_cells_generic(struct kempld_device_data *pld) in kempld_register_cells_generic() argument
104 if (pld->feature_mask & KEMPLD_FEATURE_BIT_I2C) in kempld_register_cells_generic()
107 if (pld->feature_mask & KEMPLD_FEATURE_BIT_WATCHDOG) in kempld_register_cells_generic()
110 if (pld->feature_mask & KEMPLD_FEATURE_BIT_GPIO) in kempld_register_cells_generic()
113 if (pld->feature_mask & KEMPLD_FEATURE_MASK_UART) in kempld_register_cells_generic()
116 return mfd_add_devices(pld->dev, -1, devs, i, NULL, 0, NULL); in kempld_register_cells_generic()
170 u8 kempld_read8(struct kempld_device_data *pld, u8 index) in kempld_read8() argument
172 iowrite8(index, pld->io_index); in kempld_read8()
173 return ioread8(pld->io_data); in kempld_read8()
185 void kempld_write8(struct kempld_device_data *pld, u8 index, u8 data) in kempld_write8() argument
187 iowrite8(index, pld->io_index); in kempld_write8()
188 iowrite8(data, pld->io_data); in kempld_write8()
199 u16 kempld_read16(struct kempld_device_data *pld, u8 index) in kempld_read16() argument
201 return kempld_read8(pld, index) | kempld_read8(pld, index + 1) << 8; in kempld_read16()
213 void kempld_write16(struct kempld_device_data *pld, u8 index, u16 data) in kempld_write16() argument
215 kempld_write8(pld, index, (u8)data); in kempld_write16()
216 kempld_write8(pld, index + 1, (u8)(data >> 8)); in kempld_write16()
227 u32 kempld_read32(struct kempld_device_data *pld, u8 index) in kempld_read32() argument
229 return kempld_read16(pld, index) | kempld_read16(pld, index + 2) << 16; in kempld_read32()
241 void kempld_write32(struct kempld_device_data *pld, u8 index, u32 data) in kempld_write32() argument
243 kempld_write16(pld, index, (u16)data); in kempld_write32()
244 kempld_write16(pld, index + 2, (u16)(data >> 16)); in kempld_write32()
252 void kempld_get_mutex(struct kempld_device_data *pld) in kempld_get_mutex() argument
254 const struct kempld_platform_data *pdata = dev_get_platdata(pld->dev); in kempld_get_mutex()
256 mutex_lock(&pld->lock); in kempld_get_mutex()
257 pdata->get_hardware_mutex(pld); in kempld_get_mutex()
265 void kempld_release_mutex(struct kempld_device_data *pld) in kempld_release_mutex() argument
267 const struct kempld_platform_data *pdata = dev_get_platdata(pld->dev); in kempld_release_mutex()
269 pdata->release_hardware_mutex(pld); in kempld_release_mutex()
270 mutex_unlock(&pld->lock); in kempld_release_mutex()
282 static int kempld_get_info(struct kempld_device_data *pld) in kempld_get_info() argument
285 const struct kempld_platform_data *pdata = dev_get_platdata(pld->dev); in kempld_get_info()
288 ret = pdata->get_info(pld); in kempld_get_info()
300 if (pld->info.major < 10) in kempld_get_info()
301 major = pld->info.major + '0'; in kempld_get_info()
303 major = (pld->info.major - 10) + 'A'; in kempld_get_info()
304 if (pld->info.minor < 10) in kempld_get_info()
305 minor = pld->info.minor + '0'; in kempld_get_info()
307 minor = (pld->info.minor - 10) + 'A'; in kempld_get_info()
309 ret = scnprintf(pld->info.version, sizeof(pld->info.version), in kempld_get_info()
310 "P%X%c%c.%04X", pld->info.number, major, minor, in kempld_get_info()
311 pld->info.buildnr); in kempld_get_info()
325 static int kempld_register_cells(struct kempld_device_data *pld) in kempld_register_cells() argument
327 const struct kempld_platform_data *pdata = dev_get_platdata(pld->dev); in kempld_register_cells()
329 return pdata->register_cells(pld); in kempld_register_cells()
332 static const char *kempld_get_type_string(struct kempld_device_data *pld) in kempld_get_type_string() argument
336 switch (pld->info.type) { in kempld_get_type_string()
357 struct kempld_device_data *pld = dev_get_drvdata(dev); in kempld_version_show() local
359 return scnprintf(buf, PAGE_SIZE, "%s\n", pld->info.version); in kempld_version_show()
365 struct kempld_device_data *pld = dev_get_drvdata(dev); in kempld_specification_show() local
367 return scnprintf(buf, PAGE_SIZE, "%d.%d\n", pld->info.spec_major, in kempld_specification_show()
368 pld->info.spec_minor); in kempld_specification_show()
374 struct kempld_device_data *pld = dev_get_drvdata(dev); in kempld_type_show() local
376 return scnprintf(buf, PAGE_SIZE, "%s\n", kempld_get_type_string(pld)); in kempld_type_show()
395 static int kempld_detect_device(struct kempld_device_data *pld) in kempld_detect_device() argument
400 mutex_lock(&pld->lock); in kempld_detect_device()
403 index_reg = ioread8(pld->io_index); in kempld_detect_device()
404 if (index_reg == 0xff && ioread8(pld->io_data) == 0xff) { in kempld_detect_device()
405 mutex_unlock(&pld->lock); in kempld_detect_device()
411 iowrite8(KEMPLD_MUTEX_KEY, pld->io_index); in kempld_detect_device()
413 iowrite8(KEMPLD_MUTEX_KEY, pld->io_index); in kempld_detect_device()
416 mutex_unlock(&pld->lock); in kempld_detect_device()
418 ret = kempld_get_info(pld); in kempld_detect_device()
422 dev_info(pld->dev, "Found Kontron PLD - %s (%s), spec %d.%d\n", in kempld_detect_device()
423 pld->info.version, kempld_get_type_string(pld), in kempld_detect_device()
424 pld->info.spec_major, pld->info.spec_minor); in kempld_detect_device()
426 ret = sysfs_create_group(&pld->dev->kobj, &pld_attr_group); in kempld_detect_device()
430 ret = kempld_register_cells(pld); in kempld_detect_device()
432 sysfs_remove_group(&pld->dev->kobj, &pld_attr_group); in kempld_detect_device()
442 struct kempld_device_data *pld; in kempld_probe() local
445 pld = devm_kzalloc(dev, sizeof(*pld), GFP_KERNEL); in kempld_probe()
446 if (!pld) in kempld_probe()
453 pld->io_base = devm_ioport_map(dev, ioport->start, in kempld_probe()
455 if (!pld->io_base) in kempld_probe()
458 pld->io_index = pld->io_base; in kempld_probe()
459 pld->io_data = pld->io_base + 1; in kempld_probe()
460 pld->pld_clock = pdata->pld_clock; in kempld_probe()
461 pld->dev = dev; in kempld_probe()
463 mutex_init(&pld->lock); in kempld_probe()
464 platform_set_drvdata(pdev, pld); in kempld_probe()
466 return kempld_detect_device(pld); in kempld_probe()
471 struct kempld_device_data *pld = platform_get_drvdata(pdev); in kempld_remove() local
472 const struct kempld_platform_data *pdata = dev_get_platdata(pld->dev); in kempld_remove()
474 sysfs_remove_group(&pld->dev->kobj, &pld_attr_group); in kempld_remove()
477 pdata->release_hardware_mutex(pld); in kempld_remove()