Lines Matching refs:scom
144 static int put_indirect_scom_form0(struct scom_device *scom, uint64_t value, in put_indirect_scom_form0() argument
155 rc = __put_scom(scom, ind_data, ind_addr, status); in put_indirect_scom_form0()
159 rc = __get_scom(scom, &ind_data, addr, status); in put_indirect_scom_form0()
169 static int put_indirect_scom_form1(struct scom_device *scom, uint64_t value, in put_indirect_scom_form1() argument
179 return __put_scom(scom, ind_data, ind_addr, status); in put_indirect_scom_form1()
182 static int get_indirect_scom_form0(struct scom_device *scom, uint64_t *value, in get_indirect_scom_form0() argument
190 rc = __put_scom(scom, ind_data, ind_addr, status); in get_indirect_scom_form0()
194 rc = __get_scom(scom, &ind_data, addr, status); in get_indirect_scom_form0()
205 static int raw_put_scom(struct scom_device *scom, uint64_t value, in raw_put_scom() argument
210 return put_indirect_scom_form1(scom, value, addr, status); in raw_put_scom()
212 return put_indirect_scom_form0(scom, value, addr, status); in raw_put_scom()
214 return __put_scom(scom, value, addr, status); in raw_put_scom()
217 static int raw_get_scom(struct scom_device *scom, uint64_t *value, in raw_get_scom() argument
223 return get_indirect_scom_form0(scom, value, addr, status); in raw_get_scom()
225 return __get_scom(scom, value, addr, status); in raw_get_scom()
228 static int handle_fsi2pib_status(struct scom_device *scom, uint32_t status) in handle_fsi2pib_status() argument
233 fsi_device_write(scom->fsi_dev, SCOM_FSI2PIB_RESET_REG, &dummy, in handle_fsi2pib_status()
246 static int handle_pib_status(struct scom_device *scom, uint8_t status) in handle_pib_status() argument
256 fsi_device_write(scom->fsi_dev, SCOM_FSI2PIB_RESET_REG, &dummy, in handle_pib_status()
274 static int put_scom(struct scom_device *scom, uint64_t value, in put_scom() argument
280 rc = raw_put_scom(scom, value, addr, &status); in put_scom()
284 rc = handle_fsi2pib_status(scom, status); in put_scom()
288 return handle_pib_status(scom, in put_scom()
293 static int get_scom(struct scom_device *scom, uint64_t *value, in get_scom() argument
299 rc = raw_get_scom(scom, value, addr, &status); in get_scom()
303 rc = handle_fsi2pib_status(scom, status); in get_scom()
307 return handle_pib_status(scom, in get_scom()
315 struct scom_device *scom = filep->private_data; in scom_read() local
316 struct device *dev = &scom->fsi_dev->dev; in scom_read()
323 mutex_lock(&scom->lock); in scom_read()
324 if (scom->dead) in scom_read()
327 rc = get_scom(scom, &val, *offset); in scom_read()
328 mutex_unlock(&scom->lock); in scom_read()
345 struct scom_device *scom = filep->private_data; in scom_write() local
346 struct device *dev = &scom->fsi_dev->dev; in scom_write()
358 mutex_lock(&scom->lock); in scom_write()
359 if (scom->dead) in scom_write()
362 rc = put_scom(scom, val, *offset); in scom_write()
363 mutex_unlock(&scom->lock); in scom_write()
403 static int scom_raw_read(struct scom_device *scom, void __user *argp) in scom_raw_read() argument
412 rc = raw_get_scom(scom, &acc.data, acc.addr, &status); in scom_raw_read()
421 static int scom_raw_write(struct scom_device *scom, void __user *argp) in scom_raw_write() argument
432 rc = raw_get_scom(scom, &prev_data, acc.addr, &status); in scom_raw_write()
442 rc = raw_put_scom(scom, data, acc.addr, &status); in scom_raw_write()
452 static int scom_reset(struct scom_device *scom, void __user *argp) in scom_reset() argument
460 rc = fsi_device_write(scom->fsi_dev, SCOM_PIB_RESET_REG, &dummy, in scom_reset()
463 rc = fsi_device_write(scom->fsi_dev, SCOM_FSI2PIB_RESET_REG, &dummy, in scom_reset()
468 static int scom_check(struct scom_device *scom, void __user *argp) in scom_check() argument
476 struct scom_device *scom = file->private_data; in scom_ioctl() local
480 mutex_lock(&scom->lock); in scom_ioctl()
481 if (scom->dead) { in scom_ioctl()
482 mutex_unlock(&scom->lock); in scom_ioctl()
487 rc = scom_check(scom, argp); in scom_ioctl()
490 rc = scom_raw_read(scom, argp); in scom_ioctl()
493 rc = scom_raw_write(scom, argp); in scom_ioctl()
496 rc = scom_reset(scom, argp); in scom_ioctl()
499 mutex_unlock(&scom->lock); in scom_ioctl()
505 struct scom_device *scom = container_of(inode->i_cdev, struct scom_device, cdev); in scom_open() local
507 file->private_data = scom; in scom_open()
523 struct scom_device *scom = container_of(dev, struct scom_device, dev); in scom_free() local
525 put_device(&scom->fsi_dev->dev); in scom_free()
526 kfree(scom); in scom_free()
532 struct scom_device *scom; in scom_probe() local
535 scom = kzalloc(sizeof(*scom), GFP_KERNEL); in scom_probe()
536 if (!scom) in scom_probe()
538 dev_set_drvdata(dev, scom); in scom_probe()
539 mutex_init(&scom->lock); in scom_probe()
543 kfree(scom); in scom_probe()
546 scom->fsi_dev = fsi_dev; in scom_probe()
549 scom->dev.type = &fsi_cdev_type; in scom_probe()
550 scom->dev.parent = dev; in scom_probe()
551 scom->dev.release = scom_free; in scom_probe()
552 device_initialize(&scom->dev); in scom_probe()
555 rc = fsi_get_new_minor(fsi_dev, fsi_dev_scom, &scom->dev.devt, &didx); in scom_probe()
559 dev_set_name(&scom->dev, "scom%d", didx); in scom_probe()
560 cdev_init(&scom->cdev, &scom_fops); in scom_probe()
561 rc = cdev_device_add(&scom->cdev, &scom->dev); in scom_probe()
564 rc, dev_name(&scom->dev)); in scom_probe()
570 fsi_free_minor(scom->dev.devt); in scom_probe()
572 put_device(&scom->dev); in scom_probe()
578 struct scom_device *scom = dev_get_drvdata(dev); in scom_remove() local
580 mutex_lock(&scom->lock); in scom_remove()
581 scom->dead = true; in scom_remove()
582 mutex_unlock(&scom->lock); in scom_remove()
583 cdev_device_del(&scom->cdev, &scom->dev); in scom_remove()
584 fsi_free_minor(scom->dev.devt); in scom_remove()
585 put_device(&scom->dev); in scom_remove()