1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Apple Onboard Audio GPIO definitions 4 * 5 * Copyright 2006 Johannes Berg <johannes@sipsolutions.net> 6 */ 7 8 #ifndef __AOA_GPIO_H 9 #define __AOA_GPIO_H 10 #include <linux/workqueue.h> 11 #include <linux/mutex.h> 12 13 typedef void (*notify_func_t)(void *data); 14 15 enum notify_type { 16 AOA_NOTIFY_HEADPHONE, 17 AOA_NOTIFY_LINE_IN, 18 AOA_NOTIFY_LINE_OUT, 19 }; 20 21 struct gpio_runtime; 22 struct gpio_methods { 23 /* for initialisation/de-initialisation of the GPIO layer */ 24 void (*init)(struct gpio_runtime *rt); 25 void (*exit)(struct gpio_runtime *rt); 26 27 /* turn off headphone, speakers, lineout */ 28 void (*all_amps_off)(struct gpio_runtime *rt); 29 /* turn headphone, speakers, lineout back to previous setting */ 30 void (*all_amps_restore)(struct gpio_runtime *rt); 31 32 void (*set_headphone)(struct gpio_runtime *rt, int on); 33 void (*set_speakers)(struct gpio_runtime *rt, int on); 34 void (*set_lineout)(struct gpio_runtime *rt, int on); 35 void (*set_master)(struct gpio_runtime *rt, int on); 36 37 int (*get_headphone)(struct gpio_runtime *rt); 38 int (*get_speakers)(struct gpio_runtime *rt); 39 int (*get_lineout)(struct gpio_runtime *rt); 40 int (*get_master)(struct gpio_runtime *rt); 41 42 void (*set_hw_reset)(struct gpio_runtime *rt, int on); 43 44 /* use this to be notified of any events. The notification 45 * function is passed the data, and is called in process 46 * context by the use of schedule_work. 47 * The interface for it is that setting a function to NULL 48 * removes it, and they return 0 if the operation succeeded, 49 * and -EBUSY if the notification is already assigned by 50 * someone else. */ 51 int (*set_notify)(struct gpio_runtime *rt, 52 enum notify_type type, 53 notify_func_t notify, 54 void *data); 55 /* returns 0 if not plugged in, 1 if plugged in 56 * or a negative error code */ 57 int (*get_detect)(struct gpio_runtime *rt, 58 enum notify_type type); 59 }; 60 61 struct gpio_notification { 62 struct delayed_work work; 63 notify_func_t notify; 64 void *data; 65 void *gpio_private; 66 struct mutex mutex; 67 }; 68 69 struct gpio_runtime { 70 /* to be assigned by fabric */ 71 struct device_node *node; 72 /* since everyone needs this pointer anyway... */ 73 struct gpio_methods *methods; 74 /* to be used by the gpio implementation */ 75 int implementation_private; 76 struct gpio_notification headphone_notify; 77 struct gpio_notification line_in_notify; 78 struct gpio_notification line_out_notify; 79 }; 80 81 #endif /* __AOA_GPIO_H */ 82