4 static int get_next_ulong(char **str_p, unsigned long *val, char *sep, int base)
9 if (!str_p || !(*str_p))
12 p_val = strsep(str_p, sep);
17 ret = kstrtoul(p_val, base, val);
24 int fbtft_gamma_parse_str(struct fbtft_par *par, unsigned long *curves,
25 const char *str, int size)
27 char *str_p, *curve_p = NULL;
29 unsigned long val = 0;
31 int curve_counter, value_counter;
33 fbtft_par_dbg(DEBUG_SYSFS, par, "%s() str=\n", __func__);
38 fbtft_par_dbg(DEBUG_SYSFS, par, "%s\n", str);
40 tmp = kmalloc(size+1, GFP_KERNEL);
43 memcpy(tmp, str, size+1);
45 /* replace optional separators */
59 if (curve_counter == par->gamma.num_curves) {
60 dev_err(par->info->device, "Gamma: Too many curves\n");
64 curve_p = strsep(&str_p, "\n");
67 if (value_counter == par->gamma.num_values) {
68 dev_err(par->info->device,
69 "Gamma: Too many values\n");
73 ret = get_next_ulong(&curve_p, &val, " ", 16);
76 curves[curve_counter * par->gamma.num_values + value_counter] = val;
79 if (value_counter != par->gamma.num_values) {
80 dev_err(par->info->device, "Gamma: Too few values\n");
86 if (curve_counter != par->gamma.num_curves) {
87 dev_err(par->info->device, "Gamma: Too few curves\n");
98 sprintf_gamma(struct fbtft_par *par, unsigned long *curves, char *buf)
103 mutex_lock(&par->gamma.lock);
104 for (i = 0; i < par->gamma.num_curves; i++) {
105 for (j = 0; j < par->gamma.num_values; j++)
106 len += scnprintf(&buf[len], PAGE_SIZE,
107 "%04lx ", curves[i*par->gamma.num_values + j]);
110 mutex_unlock(&par->gamma.lock);
115 static ssize_t store_gamma_curve(struct device *device,
116 struct device_attribute *attr,
117 const char *buf, size_t count)
119 struct fb_info *fb_info = dev_get_drvdata(device);
120 struct fbtft_par *par = fb_info->par;
121 unsigned long tmp_curves[FBTFT_GAMMA_MAX_VALUES_TOTAL];
124 ret = fbtft_gamma_parse_str(par, tmp_curves, buf, count);
128 ret = par->fbtftops.set_gamma(par, tmp_curves);
132 mutex_lock(&par->gamma.lock);
133 memcpy(par->gamma.curves, tmp_curves,
134 par->gamma.num_curves * par->gamma.num_values * sizeof(tmp_curves[0]));
135 mutex_unlock(&par->gamma.lock);
140 static ssize_t show_gamma_curve(struct device *device,
141 struct device_attribute *attr, char *buf)
143 struct fb_info *fb_info = dev_get_drvdata(device);
144 struct fbtft_par *par = fb_info->par;
146 return sprintf_gamma(par, par->gamma.curves, buf);
149 static struct device_attribute gamma_device_attrs[] = {
150 __ATTR(gamma, 0660, show_gamma_curve, store_gamma_curve),
154 void fbtft_expand_debug_value(unsigned long *debug)
156 switch (*debug & 0b111) {
158 *debug |= DEBUG_LEVEL_1;
161 *debug |= DEBUG_LEVEL_2;
164 *debug |= DEBUG_LEVEL_3;
167 *debug |= DEBUG_LEVEL_4;
170 *debug |= DEBUG_LEVEL_5;
173 *debug |= DEBUG_LEVEL_6;
181 static ssize_t store_debug(struct device *device,
182 struct device_attribute *attr,
183 const char *buf, size_t count)
185 struct fb_info *fb_info = dev_get_drvdata(device);
186 struct fbtft_par *par = fb_info->par;
189 ret = kstrtoul(buf, 10, &par->debug);
192 fbtft_expand_debug_value(&par->debug);
197 static ssize_t show_debug(struct device *device,
198 struct device_attribute *attr, char *buf)
200 struct fb_info *fb_info = dev_get_drvdata(device);
201 struct fbtft_par *par = fb_info->par;
203 return snprintf(buf, PAGE_SIZE, "%lu\n", par->debug);
206 static struct device_attribute debug_device_attr = \
207 __ATTR(debug, 0660, show_debug, store_debug);
210 void fbtft_sysfs_init(struct fbtft_par *par)
212 device_create_file(par->info->dev, &debug_device_attr);
213 if (par->gamma.curves && par->fbtftops.set_gamma)
214 device_create_file(par->info->dev, &gamma_device_attrs[0]);
217 void fbtft_sysfs_exit(struct fbtft_par *par)
219 device_remove_file(par->info->dev, &debug_device_attr);
220 if (par->gamma.curves && par->fbtftops.set_gamma)
221 device_remove_file(par->info->dev, &gamma_device_attrs[0]);