mm: mm_event: add compaction stat
[GitHub/LineageOS/android_kernel_motorola_exynos9610.git] / drivers / muic / muic_sysfs.c
CommitLineData
581d0897
KT
1/*
2 * driver/muic/muic_sysfs.c - micro USB switch device driver
3 *
4 * Copyright (C) 2019 Samsung Electronics
5 * Sejong Park <sejong123.park@samsung.com>
6 * Taejung Kim <tj.kim@samsung.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 *
22 */
23 #define pr_fmt(fmt) "[MUIC] " fmt
24
25#include <linux/types.h>
42bf9e3d 26#include <linux/device.h>
581d0897
KT
27#include <linux/delay.h>
28#include <linux/sec_sysfs.h>
29#include <linux/muic/muic_interface.h>
30#include <linux/muic/muic_sysfs.h>
31#if defined(CONFIG_MUIC_SUPPORT_SEC_EXT)
32#include <linux/sec_ext.h>
33#endif
34
35static ssize_t muic_sysfs_show_uart_en(struct device *dev,
36 struct device_attribute *attr, char *buf)
37{
38 struct muic_platform_data *muic_pdata = dev_get_drvdata(dev);
39 int ret = 0;
40
41 if (!muic_pdata->is_rustproof) {
42 pr_info("%s UART ENABLE\n", __func__);
43 ret = sprintf(buf, "1\n");
44 } else {
45 pr_info("%s UART DISABLE\n", __func__);
46 ret = sprintf(buf, "0\n");
47 }
48
49 return ret;
50}
51
52static ssize_t muic_sysfs_set_uart_en(struct device *dev,
53 struct device_attribute *attr, const char *buf, size_t count)
54{
55 struct muic_platform_data *muic_pdata = dev_get_drvdata(dev);
56
57 if (!strncmp(buf, "1", 1))
58 muic_pdata->is_rustproof = false;
59 else if (!strncmp(buf, "0", 1))
60 muic_pdata->is_rustproof = true;
61 else
62 pr_info("%s invalid value\n", __func__);
63
64 pr_info("%s uart_en(%d)\n",
65 __func__, !muic_pdata->is_rustproof);
66
67 return count;
68}
69
70static ssize_t muic_sysfs_show_uart_sel(struct device *dev,
71 struct device_attribute *attr, char *buf)
72{
73 struct muic_platform_data *muic_pdata = dev_get_drvdata(dev);
74 const char *mode = "UNKNOWN\n";
75
76 switch (muic_pdata->uart_path) {
77 case MUIC_PATH_UART_AP:
78 mode = "AP\n";
79 break;
80 case MUIC_PATH_UART_CP:
81 mode = "CP\n";
82 break;
83 default:
84 break;
85 }
86
87 pr_info("%s %s", __func__, mode);
88 return snprintf(buf, strlen(mode) + 1, "%s", mode);
89}
90
91static ssize_t muic_sysfs_set_uart_sel(struct device *dev,
92 struct device_attribute *attr, const char *buf, size_t count)
93{
94 struct muic_platform_data *muic_pdata = dev_get_drvdata(dev);
95 struct muic_interface_t *muic_if = muic_pdata->muic_if;
96
97 if (!strncasecmp(buf, "AP", 2))
98 muic_pdata->uart_path = MUIC_PATH_UART_AP;
99 else if (!strncasecmp(buf, "CP", 2))
100 muic_pdata->uart_path = MUIC_PATH_UART_CP;
101 else
102 pr_warn("%s invalid value\n", __func__);
103
104 if (muic_if->set_switch_to_uart)
105 muic_if->set_switch_to_uart(muic_pdata->drv_data);
106
107 pr_info("%s %s\n", __func__, buf);
108
109 return count;
110}
111
112static ssize_t muic_sysfs_show_usb_sel(struct device *dev,
113 struct device_attribute *attr, char *buf)
114{
115 return sprintf(buf, "PDA\n");
116}
117
118static ssize_t muic_sysfs_set_usb_sel(struct device *dev,
119 struct device_attribute *attr, const char *buf, size_t count)
120{
121 return count;
122}
123
124static ssize_t muic_sysfs_show_usb_en(struct device *dev,
125 struct device_attribute *attr, char *buf)
126{
127 struct muic_platform_data *muic_pdata = dev_get_drvdata(dev);
128
129 return sprintf(buf, "%s attached_dev = %d\n",
130 __func__, muic_pdata->attached_dev);
131}
132
133static ssize_t muic_sysfs_set_usb_en(struct device *dev,
134 struct device_attribute *attr, const char *buf, size_t count)
135{
136 struct muic_platform_data *muic_pdata = dev_get_drvdata(dev);
137 muic_attached_dev_t new_dev = ATTACHED_DEV_USB_MUIC;
138
139 if (!strncasecmp(buf, "1", 1))
140 muic_core_handle_attach(muic_pdata, new_dev, 0, 0);
141 else if (!strncasecmp(buf, "0", 1))
142 muic_core_handle_detach(muic_pdata);
143 else
144 pr_info("%s invalid value\n", __func__);
42bf9e3d 145
581d0897
KT
146 pr_info("%s attached_dev(%d)\n",
147 __func__, muic_pdata->attached_dev);
42bf9e3d 148
581d0897
KT
149 return count;
150}
151
152static ssize_t muic_sysfs_show_adc(struct device *dev,
153 struct device_attribute *attr, char *buf)
42bf9e3d 154{
581d0897
KT
155 struct muic_platform_data *muic_pdata = dev_get_drvdata(dev);
156 struct muic_interface_t *muic_if = muic_pdata->muic_if;
157
158 int ret;
159
160#if IS_ENABLED(CONFIG_MUIC_SYSFS_SHOW_REFRESH_ADC)
161 int is_afc_muic_ready;
162#if IS_ENABLED(CONFIG_MUIC_SUPPORT_CCIC)
163 /* TODO: NOTE: There are abnormal operations of rising volatage AFC 9V
164 * by RID enable/disable in the muic_sysfs_refresh_adc functions in the
165 * factory bianary. This is to minimize unnecessary interrupt by RID
166 * enable/disable whenever reading adc sysfs node
167 */
168 MUIC_PDATA_FUNC(muic_if->get_afc_ready, muic_pdata->drv_data, &is_afc_muic_ready);
169 if (muic_pdata->is_factory_start && muic_pdata->attached_dev == 0) {
170 /* No cable detection means RID open */
171 ret = ADC_OPEN;
172 } else {
173#if IS_ENABLED(CONFIG_MUIC_HV)
174 if (muic_pdata->is_factory_start && is_afc_muic_ready)
175 /* No need to read adc in the middle of afc detection sequences */
176 ret = ADC_GND;
177 else
178#endif
179 {
180 MUIC_PDATA_FUNC_MULTI_PARAM(muic_if->control_rid_adc,
181 muic_pdata->drv_data, MUIC_DISABLE, &ret);
182 msleep(50);
183 MUIC_PDATA_FUNC_MULTI_PARAM(muic_if->control_rid_adc,
184 muic_pdata->drv_data, MUIC_ENABLE, &ret);
185 MUIC_PDATA_FUNC(muic_if->get_adc, muic_pdata->drv_data, &ret);
186 }
42bf9e3d 187 }
581d0897
KT
188#if IS_ENABLED(CONFIG_MUIC_HV)
189 pr_info("%s: factory: %d attached_dev: %d afc ready: %d", __func__,
190 muic_pdata->is_factory_start, muic_pdata->attached_dev,
191 is_afc_muic_ready);
192#endif
193#endif
194#else
195 MUIC_PDATA_FUNC(muic_if->get_adc, muic_pdata->drv_data, &ret);
196#endif
197
198 if (ret < 0) {
199 pr_err("%s err read adc reg(%d)\n",
200 __func__, ret);
201 return sprintf(buf, "UNKNOWN\n");
202 }
203
204 return sprintf(buf, "%x\n", ret);
205}
206
207static ssize_t muic_sysfs_show_usb_state(struct device *dev,
208 struct device_attribute *attr, char *buf)
209{
210 struct muic_platform_data *muic_pdata = dev_get_drvdata(dev);
211 static unsigned long swtich_slot_time;
212
213 if (printk_timed_ratelimit(&swtich_slot_time, 5000))
214 pr_info("%s muic_pdata->attached_dev(%d)\n",
215 __func__, muic_pdata->attached_dev);
216
217 switch (muic_pdata->attached_dev) {
218 case ATTACHED_DEV_USB_MUIC:
219 case ATTACHED_DEV_CDP_MUIC:
220 case ATTACHED_DEV_JIG_USB_OFF_MUIC:
221 case ATTACHED_DEV_JIG_USB_ON_MUIC:
222 return sprintf(buf, "USB_STATE_CONFIGURED\n");
223 default:
224 break;
225 }
226
42bf9e3d
KT
227 return 0;
228}
229
581d0897
KT
230#if IS_ENABLED(CONFIG_MUIC_DEBUG)
231static ssize_t muic_sysfs_show_mansw(struct device *dev,
232 struct device_attribute *attr, char *buf)
42bf9e3d 233{
581d0897
KT
234 struct muic_platform_data *muic_pdata = dev_get_drvdata(dev);
235 struct muic_interface_t *muic_if = muic_pdata->muic_if;
236 char mesg[256] = "";
237 int ret;
238
239 MUIC_PDATA_FUNC_MULTI_PARAM(muic_if->show_register, muic_pdata->drv_data, mesg, &ret);
240 pr_info("%s:%s\n", __func__, mesg);
241 return sprintf(buf, "%s\n", mesg);
242}
243
244static ssize_t muic_sysfs_show_interrupt_status(struct device *dev,
245 struct device_attribute *attr, char *buf)
246{
247 struct muic_platform_data *muic_pdata = dev_get_drvdata(dev);
248 struct muic_interface_t *muic_if = muic_pdata->muic_if;
249 char mesg[256] = "";
250 int ret;
251
252 MUIC_PDATA_FUNC_MULTI_PARAM(muic_if->show_register, muic_pdata->drv_data, mesg, &ret);
253 pr_info("%s:%s\n", __func__, mesg);
254 return sprintf(buf, "%s\n", mesg);
255}
256
257static ssize_t muic_sysfs_show_registers(struct device *dev,
258 struct device_attribute *attr, char *buf)
259{
260 struct muic_platform_data *muic_pdata = dev_get_drvdata(dev);
261 struct muic_interface_t *muic_if = muic_pdata->muic_if;
262 char mesg[256] = "";
263 int ret;
264
265 MUIC_PDATA_FUNC_MULTI_PARAM(muic_if->show_register, muic_pdata->drv_data, mesg, &ret);
266 pr_info("%s:%s\n", __func__, mesg);
267 return sprintf(buf, "%s\n", mesg);
268}
269#endif
270
271#if IS_ENABLED(CONFIG_USB_HOST_NOTIFY)
272static ssize_t muic_sysfs_show_otg_test(struct device *dev,
273 struct device_attribute *attr, char *buf)
274{
275 struct muic_platform_data *muic_pdata = dev_get_drvdata(dev);
276 struct muic_interface_t *muic_if = muic_pdata->muic_if;
277 char mesg[256] = "";
278 int ret;
279
280 MUIC_PDATA_FUNC_MULTI_PARAM(muic_if->show_register, muic_pdata->drv_data, mesg, &ret);
281 pr_info("%s:%s\n", __func__, mesg);
282 return sprintf(buf, "%s\n", mesg);
283}
284
285static ssize_t muic_sysfs_set_otg_test(struct device *dev,
286 struct device_attribute *attr, const char *buf, size_t count)
287{
288 struct muic_platform_data *muic_pdata = dev_get_drvdata(dev);
289#if IS_ENABLED(CONFIG_SEC_FACTORY)
290 struct muic_interface_t *muic_if = muic_pdata->muic_if;
291 int ret =0;
292#endif
293
294 pr_info("%s buf:%s\n", __func__, buf);
295
296 /*
297 * The otg_test is set 0 durring the otg test. Not 1 !!!
298 */
42bf9e3d 299
581d0897
KT
300 if (!strncmp(buf, "0", 1)) {
301 muic_pdata->is_otg_test = 1;
302#if IS_ENABLED(CONFIG_SEC_FACTORY)
303 MUIC_PDATA_FUNC_MULTI_PARAM(muic_if->set_otg_reg, muic_pdata->drv_data, 1, &ret);
304#endif
305 } else if (!strncmp(buf, "1", 1)) {
306 muic_pdata->is_otg_test = 0;
307#if IS_ENABLED(CONFIG_SEC_FACTORY)
308 MUIC_PDATA_FUNC_MULTI_PARAM(muic_if->set_otg_reg, muic_pdata->drv_data, 0, &ret);
309#endif
310 } else {
311 pr_info("%s Wrong command\n", __func__);
312 return count;
42bf9e3d
KT
313 }
314
581d0897
KT
315 return count;
316}
317#endif
318
319static ssize_t muic_sysfs_show_attached_dev(struct device *dev,
320 struct device_attribute *attr, char *buf)
321{
322 struct muic_platform_data *muic_pdata = dev_get_drvdata(dev);
323 int mdev = muic_pdata->attached_dev;
324
325 pr_info("%s attached_dev:%d\n", __func__, mdev);
326
327 switch (mdev) {
328 case ATTACHED_DEV_NONE_MUIC:
329 return sprintf(buf, "No VPS\n");
330 case ATTACHED_DEV_USB_MUIC:
331 return sprintf(buf, "USB\n");
332 case ATTACHED_DEV_CDP_MUIC:
333 return sprintf(buf, "CDP\n");
334 case ATTACHED_DEV_OTG_MUIC:
335 return sprintf(buf, "OTG\n");
336 case ATTACHED_DEV_TA_MUIC:
337 return sprintf(buf, "TA\n");
338 case ATTACHED_DEV_JIG_UART_OFF_MUIC:
339 return sprintf(buf, "JIG UART OFF\n");
340 case ATTACHED_DEV_JIG_UART_OFF_VB_MUIC:
341 return sprintf(buf, "JIG UART OFF/VB\n");
342 case ATTACHED_DEV_JIG_UART_ON_MUIC:
343 return sprintf(buf, "JIG UART ON\n");
344 case ATTACHED_DEV_JIG_UART_ON_VB_MUIC:
345 return sprintf(buf, "JIG UART ON/VB\n");
346 case ATTACHED_DEV_JIG_USB_OFF_MUIC:
347 return sprintf(buf, "JIG USB OFF\n");
348 case ATTACHED_DEV_JIG_USB_ON_MUIC:
349 return sprintf(buf, "JIG USB ON\n");
350 case ATTACHED_DEV_DESKDOCK_MUIC:
351 case ATTACHED_DEV_DESKDOCK_VB_MUIC:
352 return sprintf(buf, "DESKDOCK\n");
353 case ATTACHED_DEV_AUDIODOCK_MUIC:
354 return sprintf(buf, "AUDIODOCK\n");
355 case ATTACHED_DEV_CHARGING_CABLE_MUIC:
356 return sprintf(buf, "PS CABLE\n");
357 case ATTACHED_DEV_AFC_CHARGER_5V_MUIC:
358 case ATTACHED_DEV_AFC_CHARGER_9V_MUIC:
359 case ATTACHED_DEV_QC_CHARGER_5V_MUIC:
360 case ATTACHED_DEV_QC_CHARGER_9V_MUIC:
361 return sprintf(buf, "AFC Charger\n");
362 case ATTACHED_DEV_FACTORY_UART_MUIC:
363 return sprintf(buf, "FACTORY UART\n");
364 default:
365 break;
42bf9e3d
KT
366 }
367
581d0897
KT
368 return sprintf(buf, "UNKNOWN\n");
369}
370
371static ssize_t muic_sysfs_show_audio_path(struct device *dev,
372 struct device_attribute *attr, char *buf)
373{
374 return 0;
375}
376
377static ssize_t muic_sysfs_set_audio_path(struct device *dev,
378 struct device_attribute *attr, const char *buf, size_t count)
379{
380 return 0;
381}
382
383static ssize_t muic_sysfs_show_apo_factory(struct device *dev,
384 struct device_attribute *attr, char *buf)
385{
386 struct muic_platform_data *muic_pdata = dev_get_drvdata(dev);
387 const char *mode;
388
389 /* true: Factory mode, false: not Factory mode */
390 if (muic_pdata->is_factory_start)
391 mode = "FACTORY_MODE";
42bf9e3d 392 else
581d0897 393 mode = "NOT_FACTORY_MODE";
42bf9e3d 394
581d0897
KT
395 pr_info("%s : %s\n",
396 __func__, mode);
397
398 return sprintf(buf, "%s\n", mode);
42bf9e3d 399}
42bf9e3d 400
581d0897
KT
401static ssize_t muic_sysfs_set_apo_factory(struct device *dev,
402 struct device_attribute *attr, const char *buf, size_t count)
42bf9e3d 403{
581d0897
KT
404 struct muic_platform_data *muic_pdata = dev_get_drvdata(dev);
405
406 /* "FACTORY_START": factory mode */
407 if (!strncmp(buf, "FACTORY_START", 13))
408 muic_pdata->is_factory_start = true;
409 else
410 pr_info("%s Wrong command\n", __func__);
411
412 return count;
413}
414
415static ssize_t muic_show_vbus_value(struct device *dev,
416 struct device_attribute *attr, char *buf)
417{
418 struct muic_platform_data *muic_pdata = dev_get_drvdata(dev);
419 struct muic_interface_t *muic_if = muic_pdata->muic_if;
420 int val = 0;
421
422 MUIC_PDATA_FUNC(muic_if->get_vbus_voltage, muic_pdata->drv_data, &val);
423
424 if (val > 0)
425 return sprintf(buf, "%dV\n", val);
426
427 return sprintf(buf, "UNKNOWN\n");
428}
429
430#if IS_ENABLED(CONFIG_MUIC_HV)
431static ssize_t muic_sysfs_show_afc_disable(struct device *dev,
432 struct device_attribute *attr, char *buf)
433{
434 struct muic_platform_data *muic_pdata = dev_get_drvdata(dev);
435
436 if (muic_pdata->afc_disable) {
437 pr_info("%s AFC DISABLE\n", __func__);
438 return sprintf(buf, "1\n");
439 }
440
441 pr_info("%s AFC ENABLE", __func__);
442 return sprintf(buf, "0\n");
42bf9e3d 443}
42bf9e3d 444
581d0897
KT
445static ssize_t muic_sysfs_set_afc_disable(struct device *dev,
446 struct device_attribute *attr, const char *buf, size_t count)
447{
448 struct muic_platform_data *pdata = dev_get_drvdata(dev);
449 bool curr_val = pdata->afc_disable;
450 int param_val, ret = 0;
451
452 if (!strncasecmp(buf, "1", 1))
453 pdata->afc_disable = true;
454 else if (!strncasecmp(buf, "0", 1))
455 pdata->afc_disable = false;
456 else
457 pr_warn("%s invalid value\n", __func__);
458
459#if IS_ENABLED(CONFIG_MUIC_MANAGER)
460 param_val = pdata->afc_disable ? '1' : '0';
461#endif
462
463#ifdef CM_OFFSET
464 ret = sec_set_param(CM_OFFSET + 1, (char)param_val);
465 if (ret < 0) {
466 pr_err("%s:set_param failed - %02x:%02x(%d)\n",
467 __func__, param_val, curr_val, ret);
468 pdata->afc_disable = curr_val;
469 return ret;
470 }
471#else
472 pr_err("%s:set_param is NOT supported! - %02x:%02x(%d)\n",
473 __func__, param_val, curr_val, ret);
474#endif
475 pr_info("%s afc_disable(%d)\n", __func__, pdata->afc_disable);
476
477 return count;
478}
479
480#if IS_ENABLED(CONFIG_HV_MUIC_VOLTAGE_CTRL)
481static ssize_t muic_store_afc_set_voltage(struct device *dev,
482 struct device_attribute *attr, const char *buf, size_t count)
483{
484 struct muic_platform_data *muic_pdata = dev_get_drvdata(dev);
485 struct muic_interface_t *muic_if = muic_pdata->muic_if;
486 int ret = 0;
487
488 if (!strncasecmp(buf, "5V", 2)) {
489 MUIC_PDATA_FUNC_MULTI_PARAM(muic_if->set_afc_voltage, muic_pdata->drv_data, 5, &ret);
490 } else if (!strncasecmp(buf, "9V", 2)) {
491 MUIC_PDATA_FUNC_MULTI_PARAM(muic_if->set_afc_voltage, muic_pdata->drv_data, 9, &ret);
492 } else {
493 pr_warn("%s invalid value : %s\n", __func__, buf);
494 }
495
496 return count;
497}
498#endif /* CONFIG_HV_MUIC_VOLTAGE_CTRL */
499#endif /* CONFIG_MUIC_HV */
500
501#if IS_ENABLED(CONFIG_HICCUP_CHARGER)
502static ssize_t hiccup_show(struct device *dev,
503 struct device_attribute *attr, char *buf)
504{
505 struct muic_platform_data *pdata = dev_get_drvdata(dev);
506 struct muic_interface_t *muic_if = pdata->muic_if;
507 int ret;
508
509 MUIC_PDATA_FUNC(muic_if->get_hiccup_mode,
510 pdata->drv_data, &ret);
511
512 if (ret)
513 return sprintf(buf, "ENABLE\n");
514 else
515 return sprintf(buf, "DISABLE\n");
516}
517
518static ssize_t hiccup_store(struct device *dev,
519 struct device_attribute *attr, const char *buf, size_t count)
520{
521 struct muic_platform_data *pdata = dev_get_drvdata(dev);
522 struct muic_interface_t *muic_if = pdata->muic_if;
523 int ret;
524
525 if (!strncasecmp(buf, "DISABLE", 7)) {
526 MUIC_PDATA_FUNC_MULTI_PARAM(muic_if->set_hiccup_mode,
527 pdata->drv_data, MUIC_DISABLE, &ret);
528 MUIC_PDATA_FUNC(muic_if->set_com_to_open,
529 pdata->drv_data, &ret);
530 } else
531 pr_warn("%s invalid com : %s\n", __func__, buf);
532
533 return count;
534}
535#endif /* CONFIG_HICCUP_CHARGER */
536
537static DEVICE_ATTR(uart_en, 0664, muic_sysfs_show_uart_en,
538 muic_sysfs_set_uart_en);
539static DEVICE_ATTR(uart_sel, 0664, muic_sysfs_show_uart_sel,
540 muic_sysfs_set_uart_sel);
541static DEVICE_ATTR(usb_sel, 0664, muic_sysfs_show_usb_sel,
542 muic_sysfs_set_usb_sel);
543static DEVICE_ATTR(adc, 0664, muic_sysfs_show_adc, NULL);
544
545#if IS_ENABLED(DEBUG_MUIC)
546static DEVICE_ATTR(mansw, 0664, muic_sysfs_show_mansw, NULL);
547static DEVICE_ATTR(dump_registers, 0664, muic_sysfs_show_registers, NULL);
548static DEVICE_ATTR(int_status, 0664, muic_sysfs_show_interrupt_status, NULL);
549#endif
550static DEVICE_ATTR(usb_state, 0664, muic_sysfs_show_usb_state, NULL);
551#if IS_ENABLED(CONFIG_USB_HOST_NOTIFY)
552static DEVICE_ATTR(otg_test, 0664,
553 muic_sysfs_show_otg_test, muic_sysfs_set_otg_test);
554#endif
555static DEVICE_ATTR(attached_dev, 0664, muic_sysfs_show_attached_dev, NULL);
556static DEVICE_ATTR(audio_path, 0664,
557 muic_sysfs_show_audio_path, muic_sysfs_set_audio_path);
558static DEVICE_ATTR(apo_factory, 0664,
559 muic_sysfs_show_apo_factory,
560 muic_sysfs_set_apo_factory);
561static DEVICE_ATTR(usb_en, 0664,
562 muic_sysfs_show_usb_en,
563 muic_sysfs_set_usb_en);
564static DEVICE_ATTR(vbus_value, 0444, muic_show_vbus_value, NULL);
565#if IS_ENABLED(CONFIG_MUIC_HV)
566static DEVICE_ATTR(afc_disable, 0664,
567 muic_sysfs_show_afc_disable, muic_sysfs_set_afc_disable);
568#if IS_ENABLED(CONFIG_HV_MUIC_VOLTAGE_CTRL)
569static DEVICE_ATTR(afc_set_voltage, 0220,
570 NULL, muic_store_afc_set_voltage);
571#endif /* CONFIG_HV_MUIC_VOLTAGE_CTRL */
572#endif /* CONFIG_MUIC_HV */
573#if IS_ENABLED(CONFIG_HICCUP_CHARGER)
574static DEVICE_ATTR_RW(hiccup);
575#endif /* CONFIG_HICCUP_CHARGER */
576
577static struct attribute *muic_sysfs_attributes[] = {
578 &dev_attr_uart_en.attr,
579 &dev_attr_uart_sel.attr,
580 &dev_attr_usb_sel.attr,
581 &dev_attr_adc.attr,
582#if IS_ENABLED(DEBUG_MUIC)
583 &dev_attr_mansw.attr,
584 &dev_attr_dump_registers.attr,
585 &dev_attr_int_status.attr,
586#endif
587 &dev_attr_usb_state.attr,
588#if IS_ENABLED(CONFIG_USB_HOST_NOTIFY)
589 &dev_attr_otg_test.attr,
590#endif
591 &dev_attr_attached_dev.attr,
592 &dev_attr_audio_path.attr,
593 &dev_attr_apo_factory.attr,
594 &dev_attr_usb_en.attr,
595 &dev_attr_vbus_value.attr,
596#if IS_ENABLED(CONFIG_MUIC_HV)
597 &dev_attr_afc_disable.attr,
598#if IS_ENABLED(CONFIG_HV_MUIC_VOLTAGE_CTRL)
599 &dev_attr_afc_set_voltage.attr,
600#endif /* CONFIG_HV_MUIC_VOLTAGE_CTRL */
601#endif /* CONFIG_MUIC_HV */
602#if IS_ENABLED(CONFIG_HICCUP_CHARGER)
603 &dev_attr_hiccup.attr,
604#endif /* CONFIG_HICCUP_CHARGER */
605 NULL
606};
607
608static const struct attribute_group muic_sysfs_group = {
609 .attrs = muic_sysfs_attributes,
610};
611
612int muic_sysfs_init(struct muic_platform_data *muic_pdata)
613{
614 int ret;
615 /* create sysfs group */
616#if IS_ENABLED(CONFIG_SEC_FACTORY)
617 muic_pdata->switch_device = sec_device_find("switch");
618#endif
619 mutex_init(&muic_pdata->sysfs_mutex);
620
621 if (muic_pdata->switch_device == NULL)
622 muic_pdata->switch_device = sec_device_create(NULL, "switch");
623
624 if (IS_ERR(muic_pdata->switch_device)) {
625 pr_err("%s Failed to create device(switch)!\n", __func__);
626 ret = -ENODEV;
627 return ret;
628 }
629
630 ret = sysfs_create_group(&muic_pdata->switch_device->kobj, &muic_sysfs_group);
631 if (ret) {
632 pr_err("failed to create sysfs\n");
633 return ret;
634 }
635 dev_set_drvdata(muic_pdata->switch_device, muic_pdata);
636 return ret;
637}
638
639void muic_sysfs_deinit(struct muic_platform_data *muic_pdata)
640{
641 if (muic_pdata->switch_device)
642 sysfs_remove_group(&muic_pdata->switch_device->kobj, &muic_sysfs_group);
643}