static struct rmi_control_handler_data *driver_ctl_attach(struct device *dev, void *data) { struct rmi_device *rmi_dev = to_rmi_device(dev); struct driver_ctl_data *ctl_data; int retval; struct rmi_driver_data *driver_data = dev_get_drvdata(&rmi_dev->dev); rmi_dev = to_rmi_device(dev); dev_dbg(dev, "%s called.\n", __func__); ctl_data = devm_kzalloc(dev, sizeof(struct driver_ctl_data), GFP_KERNEL); if (!ctl_data) return NULL; ctl_data->rmi_dev = rmi_dev; dev_dbg(dev, "Checking BSR.\n"); if (driver_data && driver_data->pdt_props.has_bsr) { retval = device_create_file(dev, &bsr_attribute); if (retval < 0) dev_warn(dev, "Failed to create sysfs file bsr.\n"); } #ifdef CONFIG_RMI4_DEBUG setup_debugfs(ctl_data); #endif return &ctl_data->hdata; }
static ssize_t rmi_driver_bsr_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { int retval; unsigned long val; struct rmi_device *rmi_dev = to_rmi_device(dev); struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev); /* need to convert the string data to an actual value */ retval = strict_strtoul(buf, 10, &val); if (retval < 0 || val > 255) { dev_err(dev, "Invalid value '%s' written to BSR.\n", buf); return -EINVAL; } retval = rmi_write(rmi_dev, BSR_LOCATION, (u8)val); if (retval < 0) { dev_err(dev, "%s : failed to write bsr %lu to %#06x\n", __func__, val, BSR_LOCATION); return retval; } data->bsr = val; return count; }
static ssize_t rmi_driver_bsr_show(struct device *dev, struct device_attribute *attr, char *buf) { struct rmi_device *rmi_dev = to_rmi_device(dev); struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev); return snprintf(buf, PAGE_SIZE, "%u\n", data->bsr); }
static int rmi_physical_remove(struct device *dev) { struct rmi_driver *driver; struct rmi_device *rmi_dev = to_rmi_device(dev); driver = to_rmi_driver(dev->driver); if (driver->remove) return driver->remove(rmi_dev); return 0; }
static int driver_ctl_cleanup(struct rmi_control_handler_data *hdata) { struct device *dev = hdata->dev; struct rmi_device *rmi_dev = to_rmi_device(dev); struct rmi_driver_data *driver_data = dev_get_drvdata(&rmi_dev->dev); struct driver_ctl_data *ctl_data = container_of(hdata, struct driver_ctl_data, hdata); teardown_debugfs(ctl_data); if (driver_data->pdt_props.has_bsr) device_remove_file(&rmi_dev->dev, &bsr_attribute); devm_kfree(dev, ctl_data); return 0; }
static void rmi_release_device(struct device *dev) { struct rmi_device *rmi_dev = to_rmi_device(dev); kfree(rmi_dev); }