/* * External connector (extcon) class driver * * Copyright (C) 2012 Samsung Electronics * Author: Donggeun Kim * Author: MyungJoo Ham * * based on switch class driver * Copyright (C) 2008 Google, Inc. * Author: Mike Lockwood * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and * may be copied, distributed, and modified under those terms. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #ifndef __LINUX_EXTCON_H__ #define __LINUX_EXTCON_H__ /** * struct extcon_dev - An extcon device represents one external connector. * @name The name of this extcon device. Parent device name is used * if NULL. * @print_name An optional callback to override the method to print the * name of the extcon device. * @print_state An optional callback to override the method to print the * status of the extcon device. * @dev Device of this extcon. Do not provide at register-time. * @state Attach/detach state of this extcon. Do not provide at * register-time * * In most cases, users only need to provide "User initializing data" of * this struct when registering an extcon. In some exceptional cases, * optional callbacks may be needed. However, the values in "internal data" * are overwritten by register function. */ struct extcon_dev { /* --- Optional user initializing data --- */ const char *name; /* --- Optional callbacks to override class functions --- */ ssize_t (*print_name)(struct extcon_dev *edev, char *buf); ssize_t (*print_state)(struct extcon_dev *edev, char *buf); /* --- Internal data. Please do not set. --- */ struct device *dev; u32 state; }; #if IS_ENABLED(CONFIG_EXTCON) extern int extcon_dev_register(struct extcon_dev *edev, struct device *dev); extern void extcon_dev_unregister(struct extcon_dev *edev); static inline u32 extcon_get_state(struct extcon_dev *edev) { return edev->state; } extern void extcon_set_state(struct extcon_dev *edev, u32 state); #else /* CONFIG_EXTCON */ static inline int extcon_dev_register(struct extcon_dev *edev, struct device *dev) { return 0; } static inline void extcon_dev_unregister(struct extcon_dev *edev) { } static inline u32 extcon_get_state(struct extcon_dev *edev) { return 0; } static inline void extcon_set_state(struct extcon_dev *edev, u32 state) { } #endif /* CONFIG_EXTCON */ #endif /* __LINUX_EXTCON_H__ */