162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Driver for the Auvitek AU0828 USB bridge 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2008 Steven Toth <stoth@linuxtv.org> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/bitops.h> 1162306a36Sopenharmony_ci#include <linux/usb.h> 1262306a36Sopenharmony_ci#include <linux/i2c.h> 1362306a36Sopenharmony_ci#include <linux/i2c-algo-bit.h> 1462306a36Sopenharmony_ci#include <media/tveeprom.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* Analog */ 1762306a36Sopenharmony_ci#include <linux/videodev2.h> 1862306a36Sopenharmony_ci#include <media/videobuf2-v4l2.h> 1962306a36Sopenharmony_ci#include <media/videobuf2-vmalloc.h> 2062306a36Sopenharmony_ci#include <media/v4l2-device.h> 2162306a36Sopenharmony_ci#include <media/v4l2-ctrls.h> 2262306a36Sopenharmony_ci#include <media/v4l2-fh.h> 2362306a36Sopenharmony_ci#include <media/media-device.h> 2462306a36Sopenharmony_ci#include <media/media-dev-allocator.h> 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci/* DVB */ 2762306a36Sopenharmony_ci#include <media/demux.h> 2862306a36Sopenharmony_ci#include <media/dmxdev.h> 2962306a36Sopenharmony_ci#include <media/dvb_demux.h> 3062306a36Sopenharmony_ci#include <media/dvb_frontend.h> 3162306a36Sopenharmony_ci#include <media/dvb_net.h> 3262306a36Sopenharmony_ci#include <media/dvbdev.h> 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci#include "au0828-reg.h" 3562306a36Sopenharmony_ci#include "au0828-cards.h" 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#define URB_COUNT 16 3862306a36Sopenharmony_ci#define URB_BUFSIZE (0xe522) 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci/* Analog constants */ 4162306a36Sopenharmony_ci#define NTSC_STD_W 720 4262306a36Sopenharmony_ci#define NTSC_STD_H 480 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#define AU0828_INTERLACED_DEFAULT 1 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci/* Definition for AU0828 USB transfer */ 4762306a36Sopenharmony_ci#define AU0828_MAX_ISO_BUFS 12 /* maybe resize this value in the future */ 4862306a36Sopenharmony_ci#define AU0828_ISO_PACKETS_PER_URB 128 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci#define AU0828_MIN_BUF 4 5162306a36Sopenharmony_ci#define AU0828_DEF_BUF 8 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci#define AU0828_MAX_INPUT 4 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci/* au0828 resource types (used for res_get/res_lock etc */ 5662306a36Sopenharmony_ci#define AU0828_RESOURCE_VIDEO 0x01 5762306a36Sopenharmony_ci#define AU0828_RESOURCE_VBI 0x02 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_cienum au0828_itype { 6062306a36Sopenharmony_ci AU0828_VMUX_UNDEFINED = 0, 6162306a36Sopenharmony_ci AU0828_VMUX_COMPOSITE, 6262306a36Sopenharmony_ci AU0828_VMUX_SVIDEO, 6362306a36Sopenharmony_ci AU0828_VMUX_CABLE, 6462306a36Sopenharmony_ci AU0828_VMUX_TELEVISION, 6562306a36Sopenharmony_ci AU0828_VMUX_DVB, 6662306a36Sopenharmony_ci}; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_cistruct au0828_input { 6962306a36Sopenharmony_ci enum au0828_itype type; 7062306a36Sopenharmony_ci unsigned int vmux; 7162306a36Sopenharmony_ci unsigned int amux; 7262306a36Sopenharmony_ci void (*audio_setup) (void *priv, int enable); 7362306a36Sopenharmony_ci}; 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cistruct au0828_board { 7662306a36Sopenharmony_ci char *name; 7762306a36Sopenharmony_ci unsigned int tuner_type; 7862306a36Sopenharmony_ci unsigned char tuner_addr; 7962306a36Sopenharmony_ci unsigned char i2c_clk_divider; 8062306a36Sopenharmony_ci unsigned char has_ir_i2c:1; 8162306a36Sopenharmony_ci unsigned char has_analog:1; 8262306a36Sopenharmony_ci struct au0828_input input[AU0828_MAX_INPUT]; 8362306a36Sopenharmony_ci}; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_cistruct au0828_dvb { 8662306a36Sopenharmony_ci struct mutex lock; 8762306a36Sopenharmony_ci struct dvb_adapter adapter; 8862306a36Sopenharmony_ci struct dvb_frontend *frontend; 8962306a36Sopenharmony_ci struct dvb_demux demux; 9062306a36Sopenharmony_ci struct dmxdev dmxdev; 9162306a36Sopenharmony_ci struct dmx_frontend fe_hw; 9262306a36Sopenharmony_ci struct dmx_frontend fe_mem; 9362306a36Sopenharmony_ci struct dvb_net net; 9462306a36Sopenharmony_ci int feeding; 9562306a36Sopenharmony_ci int start_count; 9662306a36Sopenharmony_ci int stop_count; 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci int (*set_frontend)(struct dvb_frontend *fe); 9962306a36Sopenharmony_ci}; 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_cienum au0828_stream_state { 10262306a36Sopenharmony_ci STREAM_OFF, 10362306a36Sopenharmony_ci STREAM_INTERRUPT, 10462306a36Sopenharmony_ci STREAM_ON 10562306a36Sopenharmony_ci}; 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci#define AUVI_INPUT(nr) (dev->board.input[nr]) 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci/* device state */ 11062306a36Sopenharmony_cienum au0828_dev_state { 11162306a36Sopenharmony_ci DEV_INITIALIZED = 0, 11262306a36Sopenharmony_ci DEV_DISCONNECTED = 1, 11362306a36Sopenharmony_ci DEV_MISCONFIGURED = 2 11462306a36Sopenharmony_ci}; 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_cistruct au0828_dev; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_cistruct au0828_usb_isoc_ctl { 11962306a36Sopenharmony_ci /* max packet size of isoc transaction */ 12062306a36Sopenharmony_ci int max_pkt_size; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci /* number of allocated urbs */ 12362306a36Sopenharmony_ci int num_bufs; 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci /* urb for isoc transfers */ 12662306a36Sopenharmony_ci struct urb **urb; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci /* transfer buffers for isoc transfer */ 12962306a36Sopenharmony_ci char **transfer_buffer; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci /* Last buffer command and region */ 13262306a36Sopenharmony_ci u8 cmd; 13362306a36Sopenharmony_ci int pos, size, pktsize; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci /* Last field: ODD or EVEN? */ 13662306a36Sopenharmony_ci int field; 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci /* Stores incomplete commands */ 13962306a36Sopenharmony_ci u32 tmp_buf; 14062306a36Sopenharmony_ci int tmp_buf_len; 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci /* Stores already requested buffers */ 14362306a36Sopenharmony_ci struct au0828_buffer *buf; 14462306a36Sopenharmony_ci struct au0828_buffer *vbi_buf; 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci /* Stores the number of received fields */ 14762306a36Sopenharmony_ci int nfields; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci /* isoc urb callback */ 15062306a36Sopenharmony_ci int (*isoc_copy) (struct au0828_dev *dev, struct urb *urb); 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci}; 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci/* buffer for one video frame */ 15562306a36Sopenharmony_cistruct au0828_buffer { 15662306a36Sopenharmony_ci /* common v4l buffer stuff -- must be first */ 15762306a36Sopenharmony_ci struct vb2_v4l2_buffer vb; 15862306a36Sopenharmony_ci struct list_head list; 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci void *mem; 16162306a36Sopenharmony_ci unsigned long length; 16262306a36Sopenharmony_ci int top_field; 16362306a36Sopenharmony_ci /* pointer to vmalloc memory address in vb */ 16462306a36Sopenharmony_ci char *vb_buf; 16562306a36Sopenharmony_ci}; 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_cistruct au0828_dmaqueue { 16862306a36Sopenharmony_ci struct list_head active; 16962306a36Sopenharmony_ci /* Counters to control buffer fill */ 17062306a36Sopenharmony_ci int pos; 17162306a36Sopenharmony_ci}; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_cistruct au0828_dev { 17462306a36Sopenharmony_ci struct mutex mutex; 17562306a36Sopenharmony_ci struct usb_device *usbdev; 17662306a36Sopenharmony_ci int boardnr; 17762306a36Sopenharmony_ci struct au0828_board board; 17862306a36Sopenharmony_ci u8 ctrlmsg[64]; 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci /* I2C */ 18162306a36Sopenharmony_ci struct i2c_adapter i2c_adap; 18262306a36Sopenharmony_ci struct i2c_algorithm i2c_algo; 18362306a36Sopenharmony_ci struct i2c_client i2c_client; 18462306a36Sopenharmony_ci u32 i2c_rc; 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci /* Digital */ 18762306a36Sopenharmony_ci struct au0828_dvb dvb; 18862306a36Sopenharmony_ci struct work_struct restart_streaming; 18962306a36Sopenharmony_ci struct timer_list bulk_timeout; 19062306a36Sopenharmony_ci int bulk_timeout_running; 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci#ifdef CONFIG_VIDEO_AU0828_V4L2 19362306a36Sopenharmony_ci /* Analog */ 19462306a36Sopenharmony_ci struct v4l2_device v4l2_dev; 19562306a36Sopenharmony_ci struct v4l2_ctrl_handler v4l2_ctrl_hdl; 19662306a36Sopenharmony_ci#endif 19762306a36Sopenharmony_ci#ifdef CONFIG_VIDEO_AU0828_RC 19862306a36Sopenharmony_ci struct au0828_rc *ir; 19962306a36Sopenharmony_ci#endif 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci struct video_device vdev; 20262306a36Sopenharmony_ci struct video_device vbi_dev; 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci /* Videobuf2 */ 20562306a36Sopenharmony_ci struct vb2_queue vb_vidq; 20662306a36Sopenharmony_ci struct vb2_queue vb_vbiq; 20762306a36Sopenharmony_ci struct mutex vb_queue_lock; 20862306a36Sopenharmony_ci struct mutex vb_vbi_queue_lock; 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci unsigned int frame_count; 21162306a36Sopenharmony_ci unsigned int vbi_frame_count; 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci struct timer_list vid_timeout; 21462306a36Sopenharmony_ci int vid_timeout_running; 21562306a36Sopenharmony_ci struct timer_list vbi_timeout; 21662306a36Sopenharmony_ci int vbi_timeout_running; 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci int users; 21962306a36Sopenharmony_ci int streaming_users; 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci int width; 22262306a36Sopenharmony_ci int height; 22362306a36Sopenharmony_ci int vbi_width; 22462306a36Sopenharmony_ci int vbi_height; 22562306a36Sopenharmony_ci u32 vbi_read; 22662306a36Sopenharmony_ci v4l2_std_id std; 22762306a36Sopenharmony_ci u32 field_size; 22862306a36Sopenharmony_ci u32 frame_size; 22962306a36Sopenharmony_ci u32 bytesperline; 23062306a36Sopenharmony_ci int type; 23162306a36Sopenharmony_ci u8 ctrl_ainput; 23262306a36Sopenharmony_ci __u8 isoc_in_endpointaddr; 23362306a36Sopenharmony_ci u8 isoc_init_ok; 23462306a36Sopenharmony_ci int greenscreen_detected; 23562306a36Sopenharmony_ci int ctrl_freq; 23662306a36Sopenharmony_ci int input_type; 23762306a36Sopenharmony_ci int std_set_in_tuner_core; 23862306a36Sopenharmony_ci unsigned int ctrl_input; 23962306a36Sopenharmony_ci long unsigned int dev_state; /* defined at enum au0828_dev_state */; 24062306a36Sopenharmony_ci enum au0828_stream_state stream_state; 24162306a36Sopenharmony_ci wait_queue_head_t open; 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci struct mutex lock; 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci /* Isoc control struct */ 24662306a36Sopenharmony_ci struct au0828_dmaqueue vidq; 24762306a36Sopenharmony_ci struct au0828_dmaqueue vbiq; 24862306a36Sopenharmony_ci struct au0828_usb_isoc_ctl isoc_ctl; 24962306a36Sopenharmony_ci spinlock_t slock; 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci /* usb transfer */ 25262306a36Sopenharmony_ci int alt; /* alternate */ 25362306a36Sopenharmony_ci int max_pkt_size; /* max packet size of isoc transaction */ 25462306a36Sopenharmony_ci int num_alt; /* Number of alternative settings */ 25562306a36Sopenharmony_ci unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */ 25662306a36Sopenharmony_ci struct urb *urb[AU0828_MAX_ISO_BUFS]; /* urb for isoc transfers */ 25762306a36Sopenharmony_ci char *transfer_buffer[AU0828_MAX_ISO_BUFS];/* transfer buffers for isoc 25862306a36Sopenharmony_ci transfer */ 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci /* DVB USB / URB Related */ 26162306a36Sopenharmony_ci bool urb_streaming, need_urb_start; 26262306a36Sopenharmony_ci struct urb *urbs[URB_COUNT]; 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci /* Preallocated transfer digital transfer buffers */ 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci char *dig_transfer_buffer[URB_COUNT]; 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci#ifdef CONFIG_MEDIA_CONTROLLER 26962306a36Sopenharmony_ci struct media_device *media_dev; 27062306a36Sopenharmony_ci struct media_pad video_pad, vbi_pad; 27162306a36Sopenharmony_ci struct media_entity *decoder; 27262306a36Sopenharmony_ci struct media_entity input_ent[AU0828_MAX_INPUT]; 27362306a36Sopenharmony_ci struct media_pad input_pad[AU0828_MAX_INPUT]; 27462306a36Sopenharmony_ci struct media_entity_notify entity_notify; 27562306a36Sopenharmony_ci struct media_entity *tuner; 27662306a36Sopenharmony_ci struct media_link *active_link; 27762306a36Sopenharmony_ci struct media_entity *active_source; 27862306a36Sopenharmony_ci struct media_entity *active_sink; 27962306a36Sopenharmony_ci struct media_entity *active_link_owner; 28062306a36Sopenharmony_ci struct media_entity *active_link_user; 28162306a36Sopenharmony_ci struct media_pipeline *active_link_user_pipe; 28262306a36Sopenharmony_ci bool active_link_shared; 28362306a36Sopenharmony_ci#endif 28462306a36Sopenharmony_ci}; 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 28862306a36Sopenharmony_ci#define au0828_read(dev, reg) au0828_readreg(dev, reg) 28962306a36Sopenharmony_ci#define au0828_write(dev, reg, value) au0828_writereg(dev, reg, value) 29062306a36Sopenharmony_ci#define au0828_andor(dev, reg, mask, value) \ 29162306a36Sopenharmony_ci au0828_writereg(dev, reg, \ 29262306a36Sopenharmony_ci (au0828_readreg(dev, reg) & ~(mask)) | ((value) & (mask))) 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci#define au0828_set(dev, reg, bit) au0828_andor(dev, (reg), (bit), (bit)) 29562306a36Sopenharmony_ci#define au0828_clear(dev, reg, bit) au0828_andor(dev, (reg), (bit), 0) 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 29862306a36Sopenharmony_ci/* au0828-core.c */ 29962306a36Sopenharmony_ciextern u32 au0828_read(struct au0828_dev *dev, u16 reg); 30062306a36Sopenharmony_ciextern u32 au0828_write(struct au0828_dev *dev, u16 reg, u32 val); 30162306a36Sopenharmony_ciextern void au0828_usb_release(struct au0828_dev *dev); 30262306a36Sopenharmony_ciextern int au0828_debug; 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 30562306a36Sopenharmony_ci/* au0828-cards.c */ 30662306a36Sopenharmony_ciextern struct au0828_board au0828_boards[]; 30762306a36Sopenharmony_ciextern struct usb_device_id au0828_usb_id_table[]; 30862306a36Sopenharmony_ciextern void au0828_gpio_setup(struct au0828_dev *dev); 30962306a36Sopenharmony_ciextern int au0828_tuner_callback(void *priv, int component, 31062306a36Sopenharmony_ci int command, int arg); 31162306a36Sopenharmony_ciextern void au0828_card_setup(struct au0828_dev *dev); 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 31462306a36Sopenharmony_ci/* au0828-i2c.c */ 31562306a36Sopenharmony_ciextern int au0828_i2c_register(struct au0828_dev *dev); 31662306a36Sopenharmony_ciextern int au0828_i2c_unregister(struct au0828_dev *dev); 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 31962306a36Sopenharmony_ci/* au0828-video.c */ 32062306a36Sopenharmony_ciextern int au0828_start_analog_streaming(struct vb2_queue *vq, 32162306a36Sopenharmony_ci unsigned int count); 32262306a36Sopenharmony_ciextern void au0828_stop_vbi_streaming(struct vb2_queue *vq); 32362306a36Sopenharmony_ci#ifdef CONFIG_VIDEO_AU0828_V4L2 32462306a36Sopenharmony_ciextern int au0828_v4l2_device_register(struct usb_interface *interface, 32562306a36Sopenharmony_ci struct au0828_dev *dev); 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ciextern int au0828_analog_register(struct au0828_dev *dev, 32862306a36Sopenharmony_ci struct usb_interface *interface); 32962306a36Sopenharmony_ciextern int au0828_analog_unregister(struct au0828_dev *dev); 33062306a36Sopenharmony_ciextern void au0828_usb_v4l2_media_release(struct au0828_dev *dev); 33162306a36Sopenharmony_ciextern void au0828_v4l2_suspend(struct au0828_dev *dev); 33262306a36Sopenharmony_ciextern void au0828_v4l2_resume(struct au0828_dev *dev); 33362306a36Sopenharmony_ci#else 33462306a36Sopenharmony_cistatic inline int au0828_v4l2_device_register(struct usb_interface *interface, 33562306a36Sopenharmony_ci struct au0828_dev *dev) 33662306a36Sopenharmony_ci{ return 0; }; 33762306a36Sopenharmony_cistatic inline int au0828_analog_register(struct au0828_dev *dev, 33862306a36Sopenharmony_ci struct usb_interface *interface) 33962306a36Sopenharmony_ci{ return 0; }; 34062306a36Sopenharmony_cistatic inline int au0828_analog_unregister(struct au0828_dev *dev) 34162306a36Sopenharmony_ci{ return 0; }; 34262306a36Sopenharmony_cistatic inline void au0828_usb_v4l2_media_release(struct au0828_dev *dev) { }; 34362306a36Sopenharmony_cistatic inline void au0828_v4l2_suspend(struct au0828_dev *dev) { }; 34462306a36Sopenharmony_cistatic inline void au0828_v4l2_resume(struct au0828_dev *dev) { }; 34562306a36Sopenharmony_ci#endif 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ci/* ----------------------------------------------------------- */ 34862306a36Sopenharmony_ci/* au0828-dvb.c */ 34962306a36Sopenharmony_ciextern int au0828_dvb_register(struct au0828_dev *dev); 35062306a36Sopenharmony_ciextern void au0828_dvb_unregister(struct au0828_dev *dev); 35162306a36Sopenharmony_civoid au0828_dvb_suspend(struct au0828_dev *dev); 35262306a36Sopenharmony_civoid au0828_dvb_resume(struct au0828_dev *dev); 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci/* au0828-vbi.c */ 35562306a36Sopenharmony_ciextern const struct vb2_ops au0828_vbi_qops; 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci#define dprintk(level, fmt, arg...)\ 35862306a36Sopenharmony_ci do { if (au0828_debug & level)\ 35962306a36Sopenharmony_ci printk(KERN_DEBUG pr_fmt(fmt), ## arg);\ 36062306a36Sopenharmony_ci } while (0) 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_ci/* au0828-input.c */ 36362306a36Sopenharmony_ci#ifdef CONFIG_VIDEO_AU0828_RC 36462306a36Sopenharmony_ciextern int au0828_rc_register(struct au0828_dev *dev); 36562306a36Sopenharmony_ciextern void au0828_rc_unregister(struct au0828_dev *dev); 36662306a36Sopenharmony_ciextern int au0828_rc_suspend(struct au0828_dev *dev); 36762306a36Sopenharmony_ciextern int au0828_rc_resume(struct au0828_dev *dev); 36862306a36Sopenharmony_ci#else 36962306a36Sopenharmony_cistatic inline int au0828_rc_register(struct au0828_dev *dev) { return 0; } 37062306a36Sopenharmony_cistatic inline void au0828_rc_unregister(struct au0828_dev *dev) { } 37162306a36Sopenharmony_cistatic inline int au0828_rc_suspend(struct au0828_dev *dev) { return 0; } 37262306a36Sopenharmony_cistatic inline int au0828_rc_resume(struct au0828_dev *dev) { return 0; } 37362306a36Sopenharmony_ci#endif 374