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()
160 rc = __get_scom(scom, &ind_data, addr, status); in put_indirect_scom_form0()
174 static int put_indirect_scom_form1(struct scom_device *scom, uint64_t value, in put_indirect_scom_form1() argument
184 return __put_scom(scom, ind_data, ind_addr, status); in put_indirect_scom_form1()
187 static int get_indirect_scom_form0(struct scom_device *scom, uint64_t *value, in get_indirect_scom_form0() argument
195 rc = __put_scom(scom, ind_data, ind_addr, status); in get_indirect_scom_form0()
200 rc = __get_scom(scom, &ind_data, addr, status); in get_indirect_scom_form0()
216 static int raw_put_scom(struct scom_device *scom, uint64_t value, in raw_put_scom() argument
221 return put_indirect_scom_form1(scom, value, addr, status); in raw_put_scom()
223 return put_indirect_scom_form0(scom, value, addr, status); in raw_put_scom()
225 return __put_scom(scom, value, addr, status); in raw_put_scom()
228 static int raw_get_scom(struct scom_device *scom, uint64_t *value, in raw_get_scom() argument
234 return get_indirect_scom_form0(scom, value, addr, status); in raw_get_scom()
236 return __get_scom(scom, value, addr, status); in raw_get_scom()
239 static int handle_fsi2pib_status(struct scom_device *scom, uint32_t status) in handle_fsi2pib_status() argument
246 fsi_device_write(scom->fsi_dev, SCOM_FSI2PIB_RESET_REG, &dummy, in handle_fsi2pib_status()
256 static int handle_pib_status(struct scom_device *scom, uint8_t status) in handle_pib_status() argument
266 fsi_device_write(scom->fsi_dev, SCOM_FSI2PIB_RESET_REG, &dummy, in handle_pib_status()
284 static int put_scom(struct scom_device *scom, uint64_t value, in put_scom() argument
291 rc = raw_put_scom(scom, value, addr, &status); in put_scom()
295 fsi_device_write(scom->fsi_dev, SCOM_FSI2PIB_RESET_REG, in put_scom()
301 rc = handle_fsi2pib_status(scom, status); in put_scom()
305 rc = handle_pib_status(scom, in put_scom()
318 static int get_scom(struct scom_device *scom, uint64_t *value, in get_scom() argument
325 rc = raw_get_scom(scom, value, addr, &status); in get_scom()
329 fsi_device_write(scom->fsi_dev, SCOM_FSI2PIB_RESET_REG, in get_scom()
335 rc = handle_fsi2pib_status(scom, status); in get_scom()
339 rc = handle_pib_status(scom, in get_scom()
355 struct scom_device *scom = filep->private_data; in scom_read() local
356 struct device *dev = &scom->fsi_dev->dev; in scom_read()
363 mutex_lock(&scom->lock); in scom_read()
364 if (scom->dead) in scom_read()
367 rc = get_scom(scom, &val, *offset); in scom_read()
368 mutex_unlock(&scom->lock); in scom_read()
385 struct scom_device *scom = filep->private_data; in scom_write() local
386 struct device *dev = &scom->fsi_dev->dev; in scom_write()
398 mutex_lock(&scom->lock); in scom_write()
399 if (scom->dead) in scom_write()
402 rc = put_scom(scom, val, *offset); in scom_write()
403 mutex_unlock(&scom->lock); in scom_write()
443 static int scom_raw_read(struct scom_device *scom, void __user *argp) in scom_raw_read() argument
452 rc = raw_get_scom(scom, &acc.data, acc.addr, &status); in scom_raw_read()
461 static int scom_raw_write(struct scom_device *scom, void __user *argp) in scom_raw_write() argument
472 rc = raw_get_scom(scom, &prev_data, acc.addr, &status); in scom_raw_write()
482 rc = raw_put_scom(scom, data, acc.addr, &status); in scom_raw_write()
492 static int scom_reset(struct scom_device *scom, void __user *argp) in scom_reset() argument
500 rc = fsi_device_write(scom->fsi_dev, SCOM_PIB_RESET_REG, &dummy, in scom_reset()
503 rc = fsi_device_write(scom->fsi_dev, SCOM_FSI2PIB_RESET_REG, &dummy, in scom_reset()
508 static int scom_check(struct scom_device *scom, void __user *argp) in scom_check() argument
516 struct scom_device *scom = file->private_data; in scom_ioctl() local
520 mutex_lock(&scom->lock); in scom_ioctl()
521 if (scom->dead) { in scom_ioctl()
522 mutex_unlock(&scom->lock); in scom_ioctl()
527 rc = scom_check(scom, argp); in scom_ioctl()
530 rc = scom_raw_read(scom, argp); in scom_ioctl()
533 rc = scom_raw_write(scom, argp); in scom_ioctl()
536 rc = scom_reset(scom, argp); in scom_ioctl()
539 mutex_unlock(&scom->lock); in scom_ioctl()
545 struct scom_device *scom = container_of(inode->i_cdev, struct scom_device, cdev); in scom_open() local
547 file->private_data = scom; in scom_open()
563 struct scom_device *scom = container_of(dev, struct scom_device, dev); in scom_free() local
565 put_device(&scom->fsi_dev->dev); in scom_free()
566 kfree(scom); in scom_free()
572 struct scom_device *scom; in scom_probe() local
575 scom = kzalloc(sizeof(*scom), GFP_KERNEL); in scom_probe()
576 if (!scom) in scom_probe()
578 dev_set_drvdata(dev, scom); in scom_probe()
579 mutex_init(&scom->lock); in scom_probe()
583 kfree(scom); in scom_probe()
586 scom->fsi_dev = fsi_dev; in scom_probe()
589 scom->dev.type = &fsi_cdev_type; in scom_probe()
590 scom->dev.parent = dev; in scom_probe()
591 scom->dev.release = scom_free; in scom_probe()
592 device_initialize(&scom->dev); in scom_probe()
595 rc = fsi_get_new_minor(fsi_dev, fsi_dev_scom, &scom->dev.devt, &didx); in scom_probe()
599 dev_set_name(&scom->dev, "scom%d", didx); in scom_probe()
600 cdev_init(&scom->cdev, &scom_fops); in scom_probe()
601 rc = cdev_device_add(&scom->cdev, &scom->dev); in scom_probe()
604 rc, dev_name(&scom->dev)); in scom_probe()
610 fsi_free_minor(scom->dev.devt); in scom_probe()
612 put_device(&scom->dev); in scom_probe()
618 struct scom_device *scom = dev_get_drvdata(dev); in scom_remove() local
620 mutex_lock(&scom->lock); in scom_remove()
621 scom->dead = true; in scom_remove()
622 mutex_unlock(&scom->lock); in scom_remove()
623 cdev_device_del(&scom->cdev, &scom->dev); in scom_remove()
624 fsi_free_minor(scom->dev.devt); in scom_remove()
625 put_device(&scom->dev); in scom_remove()