Lines Matching refs:scom
145 static int put_indirect_scom_form0(struct scom_device *scom, uint64_t value,
156 rc = __put_scom(scom, ind_data, ind_addr, status);
161 rc = __get_scom(scom, &ind_data, addr, status);
175 static int put_indirect_scom_form1(struct scom_device *scom, uint64_t value,
185 return __put_scom(scom, ind_data, ind_addr, status);
188 static int get_indirect_scom_form0(struct scom_device *scom, uint64_t *value,
196 rc = __put_scom(scom, ind_data, ind_addr, status);
201 rc = __get_scom(scom, &ind_data, addr, status);
217 static int raw_put_scom(struct scom_device *scom, uint64_t value,
222 return put_indirect_scom_form1(scom, value, addr, status);
224 return put_indirect_scom_form0(scom, value, addr, status);
226 return __put_scom(scom, value, addr, status);
229 static int raw_get_scom(struct scom_device *scom, uint64_t *value,
235 return get_indirect_scom_form0(scom, value, addr, status);
237 return __get_scom(scom, value, addr, status);
240 static int handle_fsi2pib_status(struct scom_device *scom, uint32_t status)
245 fsi_device_write(scom->fsi_dev, SCOM_FSI2PIB_RESET_REG, &dummy,
258 static int handle_pib_status(struct scom_device *scom, uint8_t status)
268 fsi_device_write(scom->fsi_dev, SCOM_FSI2PIB_RESET_REG, &dummy,
286 static int put_scom(struct scom_device *scom, uint64_t value,
293 rc = raw_put_scom(scom, value, addr, &status);
297 fsi_device_write(scom->fsi_dev, SCOM_FSI2PIB_RESET_REG,
303 rc = handle_fsi2pib_status(scom, status);
307 rc = handle_pib_status(scom,
320 static int get_scom(struct scom_device *scom, uint64_t *value,
327 rc = raw_get_scom(scom, value, addr, &status);
331 fsi_device_write(scom->fsi_dev, SCOM_FSI2PIB_RESET_REG,
337 rc = handle_fsi2pib_status(scom, status);
341 rc = handle_pib_status(scom,
357 struct scom_device *scom = filep->private_data;
358 struct device *dev = &scom->fsi_dev->dev;
365 mutex_lock(&scom->lock);
366 if (scom->dead)
369 rc = get_scom(scom, &val, *offset);
370 mutex_unlock(&scom->lock);
387 struct scom_device *scom = filep->private_data;
388 struct device *dev = &scom->fsi_dev->dev;
400 mutex_lock(&scom->lock);
401 if (scom->dead)
404 rc = put_scom(scom, val, *offset);
405 mutex_unlock(&scom->lock);
445 static int scom_raw_read(struct scom_device *scom, void __user *argp)
454 rc = raw_get_scom(scom, &acc.data, acc.addr, &status);
463 static int scom_raw_write(struct scom_device *scom, void __user *argp)
474 rc = raw_get_scom(scom, &prev_data, acc.addr, &status);
484 rc = raw_put_scom(scom, data, acc.addr, &status);
494 static int scom_reset(struct scom_device *scom, void __user *argp)
502 rc = fsi_device_write(scom->fsi_dev, SCOM_PIB_RESET_REG, &dummy,
505 rc = fsi_device_write(scom->fsi_dev, SCOM_FSI2PIB_RESET_REG, &dummy,
510 static int scom_check(struct scom_device *scom, void __user *argp)
518 struct scom_device *scom = file->private_data;
522 mutex_lock(&scom->lock);
523 if (scom->dead) {
524 mutex_unlock(&scom->lock);
529 rc = scom_check(scom, argp);
532 rc = scom_raw_read(scom, argp);
535 rc = scom_raw_write(scom, argp);
538 rc = scom_reset(scom, argp);
541 mutex_unlock(&scom->lock);
547 struct scom_device *scom = container_of(inode->i_cdev, struct scom_device, cdev);
549 file->private_data = scom;
565 struct scom_device *scom = container_of(dev, struct scom_device, dev);
567 put_device(&scom->fsi_dev->dev);
568 kfree(scom);
574 struct scom_device *scom;
577 scom = kzalloc(sizeof(*scom), GFP_KERNEL);
578 if (!scom)
580 dev_set_drvdata(dev, scom);
581 mutex_init(&scom->lock);
585 kfree(scom);
588 scom->fsi_dev = fsi_dev;
591 scom->dev.type = &fsi_cdev_type;
592 scom->dev.parent = dev;
593 scom->dev.release = scom_free;
594 device_initialize(&scom->dev);
597 rc = fsi_get_new_minor(fsi_dev, fsi_dev_scom, &scom->dev.devt, &didx);
601 dev_set_name(&scom->dev, "scom%d", didx);
602 cdev_init(&scom->cdev, &scom_fops);
603 rc = cdev_device_add(&scom->cdev, &scom->dev);
606 rc, dev_name(&scom->dev));
612 fsi_free_minor(scom->dev.devt);
614 put_device(&scom->dev);
620 struct scom_device *scom = dev_get_drvdata(dev);
622 mutex_lock(&scom->lock);
623 scom->dead = true;
624 mutex_unlock(&scom->lock);
625 cdev_device_del(&scom->cdev, &scom->dev);
626 fsi_free_minor(scom->dev.devt);
627 put_device(&scom->dev);
643 .name = "scom",