#include <asm/unaligned.h>
#include <drm/bridge/mhl.h>
#include <drm/drm_bridge.h>
#include <drm/drm_crtc.h>
#include <drm/drm_edid.h>
#include <drm/drm_encoder.h>
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/extcon.h>
#include <linux/gpio/consumer.h>
#include <linux/i2c.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/kernel.h>
#include <linux/list.h>
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/of_graph.h>
#include <linux/regulator/consumer.h>
#include <linux/slab.h>
#include <media/rc-core.h>
#include "sil-sii8620.h"
#define SII8620_BURST_BUF_LEN …
#define VAL_RX_HDMI_CTRL2_DEFVAL …
#define MHL1_MAX_PCLK …
#define MHL1_MAX_PCLK_PP_MODE …
#define MHL3_MAX_PCLK …
#define MHL3_MAX_PCLK_PP_MODE …
enum sii8620_mode { … };
enum sii8620_sink_type { … };
enum sii8620_mt_state { … };
struct sii8620 { … };
struct sii8620_mt_msg;
sii8620_mt_msg_cb;
sii8620_cb;
struct sii8620_mt_msg { … };
static const u8 sii8620_i2c_page[] = …;
static void sii8620_fetch_edid(struct sii8620 *ctx);
static void sii8620_set_upstream_edid(struct sii8620 *ctx);
static void sii8620_enable_hpd(struct sii8620 *ctx);
static void sii8620_mhl_disconnected(struct sii8620 *ctx);
static void sii8620_disconnect(struct sii8620 *ctx);
static int sii8620_clear_error(struct sii8620 *ctx)
{ … }
static void sii8620_read_buf(struct sii8620 *ctx, u16 addr, u8 *buf, int len)
{ … }
static u8 sii8620_readb(struct sii8620 *ctx, u16 addr)
{ … }
static void sii8620_write_buf(struct sii8620 *ctx, u16 addr, const u8 *buf,
int len)
{ … }
#define sii8620_write(ctx, addr, arr...) …
static void __sii8620_write_seq(struct sii8620 *ctx, const u16 *seq, int len)
{ … }
#define sii8620_write_seq(ctx, seq...) …
#define sii8620_write_seq_static(ctx, seq...) …
static void sii8620_setbits(struct sii8620 *ctx, u16 addr, u8 mask, u8 val)
{ … }
static inline bool sii8620_is_mhl3(struct sii8620 *ctx)
{ … }
static void sii8620_mt_cleanup(struct sii8620 *ctx)
{ … }
static void sii8620_mt_work(struct sii8620 *ctx)
{ … }
static void sii8620_enable_gen2_write_burst(struct sii8620 *ctx)
{ … }
static void sii8620_disable_gen2_write_burst(struct sii8620 *ctx)
{ … }
static void sii8620_start_gen2_write_burst(struct sii8620 *ctx)
{ … }
static void sii8620_mt_msc_cmd_send(struct sii8620 *ctx,
struct sii8620_mt_msg *msg)
{ … }
static struct sii8620_mt_msg *sii8620_mt_msg_new(struct sii8620 *ctx)
{ … }
static void sii8620_mt_set_cont(struct sii8620 *ctx, sii8620_cb cont)
{ … }
static void sii8620_mt_msc_cmd(struct sii8620 *ctx, u8 cmd, u8 arg1, u8 arg2)
{ … }
static void sii8620_mt_write_stat(struct sii8620 *ctx, u8 reg, u8 val)
{ … }
static inline void sii8620_mt_set_int(struct sii8620 *ctx, u8 irq, u8 mask)
{ … }
static void sii8620_mt_msc_msg(struct sii8620 *ctx, u8 cmd, u8 data)
{ … }
static void sii8620_mt_rap(struct sii8620 *ctx, u8 code)
{ … }
static void sii8620_mt_rcpk(struct sii8620 *ctx, u8 code)
{ … }
static void sii8620_mt_rcpe(struct sii8620 *ctx, u8 code)
{ … }
static void sii8620_mt_read_devcap_send(struct sii8620 *ctx,
struct sii8620_mt_msg *msg)
{ … }
static void sii8620_update_array(u8 *dst, u8 *src, int count)
{ … }
static void sii8620_identify_sink(struct sii8620 *ctx)
{ … }
static void sii8620_mr_devcap(struct sii8620 *ctx)
{ … }
static void sii8620_mr_xdevcap(struct sii8620 *ctx)
{ … }
static void sii8620_mt_read_devcap_recv(struct sii8620 *ctx,
struct sii8620_mt_msg *msg)
{ … }
static void sii8620_mt_read_devcap(struct sii8620 *ctx, bool xdevcap)
{ … }
static void sii8620_mt_read_devcap_reg_recv(struct sii8620 *ctx,
struct sii8620_mt_msg *msg)
{ … }
static void sii8620_mt_read_devcap_reg(struct sii8620 *ctx, u8 reg)
{ … }
static inline void sii8620_mt_read_xdevcap_reg(struct sii8620 *ctx, u8 reg)
{ … }
static void *sii8620_burst_get_tx_buf(struct sii8620 *ctx, int len)
{ … }
static u8 *sii8620_burst_get_rx_buf(struct sii8620 *ctx, int len)
{ … }
static void sii8620_burst_send(struct sii8620 *ctx)
{ … }
static void sii8620_burst_receive(struct sii8620 *ctx)
{ … }
static void sii8620_burst_tx_rbuf_info(struct sii8620 *ctx, int size)
{ … }
static u8 sii8620_checksum(void *ptr, int size)
{ … }
static void sii8620_mhl_burst_hdr_set(struct mhl3_burst_header *h,
enum mhl_burst_id id)
{ … }
static void sii8620_burst_tx_bits_per_pixel_fmt(struct sii8620 *ctx, u8 fmt)
{ … }
static void sii8620_burst_rx_all(struct sii8620 *ctx)
{ … }
static void sii8620_fetch_edid(struct sii8620 *ctx)
{ … }
static void sii8620_set_upstream_edid(struct sii8620 *ctx)
{ … }
static void sii8620_xtal_set_rate(struct sii8620 *ctx)
{ … }
static int sii8620_hw_on(struct sii8620 *ctx)
{ … }
static int sii8620_hw_off(struct sii8620 *ctx)
{ … }
static void sii8620_cbus_reset(struct sii8620 *ctx)
{ … }
static void sii8620_set_auto_zone(struct sii8620 *ctx)
{ … }
static void sii8620_stop_video(struct sii8620 *ctx)
{ … }
static void sii8620_set_format(struct sii8620 *ctx)
{ … }
static int mhl3_infoframe_init(struct mhl3_infoframe *frame)
{ … }
static ssize_t mhl3_infoframe_pack(struct mhl3_infoframe *frame,
void *buffer, size_t size)
{ … }
static void sii8620_set_infoframes(struct sii8620 *ctx,
struct drm_display_mode *mode)
{ … }
static void sii8620_start_video(struct sii8620 *ctx)
{ … }
static void sii8620_disable_hpd(struct sii8620 *ctx)
{ … }
static void sii8620_enable_hpd(struct sii8620 *ctx)
{ … }
static void sii8620_mhl_discover(struct sii8620 *ctx)
{ … }
static void sii8620_peer_specific_init(struct sii8620 *ctx)
{ … }
#define SII8620_MHL_VERSION …
#define SII8620_SCRATCHPAD_SIZE …
#define SII8620_INT_STAT_SIZE …
static void sii8620_set_dev_cap(struct sii8620 *ctx)
{ … }
static void sii8620_mhl_init(struct sii8620 *ctx)
{ … }
static void sii8620_emsc_enable(struct sii8620 *ctx)
{ … }
static int sii8620_wait_for_fsm_state(struct sii8620 *ctx, u8 state)
{ … }
static void sii8620_set_mode(struct sii8620 *ctx, enum sii8620_mode mode)
{ … }
static void sii8620_hpd_unplugged(struct sii8620 *ctx)
{ … }
static void sii8620_disconnect(struct sii8620 *ctx)
{ … }
static void sii8620_mhl_disconnected(struct sii8620 *ctx)
{ … }
static void sii8620_irq_disc(struct sii8620 *ctx)
{ … }
static void sii8620_read_burst(struct sii8620 *ctx)
{ … }
static void sii8620_irq_g2wb(struct sii8620 *ctx)
{ … }
static void sii8620_status_dcap_ready(struct sii8620 *ctx)
{ … }
static void sii8620_status_changed_path(struct sii8620 *ctx)
{ … }
static void sii8620_msc_mr_write_stat(struct sii8620 *ctx)
{ … }
static void sii8620_ecbus_up(struct sii8620 *ctx, int ret)
{ … }
static void sii8620_got_ecbus_speed(struct sii8620 *ctx, int ret)
{ … }
static void sii8620_mhl_burst_emsc_support_set(struct mhl_burst_emsc_support *d,
enum mhl_burst_id id)
{ … }
static void sii8620_send_features(struct sii8620 *ctx)
{ … }
static bool sii8620_rcp_consume(struct sii8620 *ctx, u8 scancode)
{ … }
static void sii8620_msc_mr_set_int(struct sii8620 *ctx)
{ … }
static struct sii8620_mt_msg *sii8620_msc_msg_first(struct sii8620 *ctx)
{ … }
static void sii8620_msc_mt_done(struct sii8620 *ctx)
{ … }
static void sii8620_msc_mr_msc_msg(struct sii8620 *ctx)
{ … }
static void sii8620_irq_msc(struct sii8620 *ctx)
{ … }
static void sii8620_irq_coc(struct sii8620 *ctx)
{ … }
static void sii8620_irq_merr(struct sii8620 *ctx)
{ … }
static void sii8620_irq_edid(struct sii8620 *ctx)
{ … }
static void sii8620_irq_scdt(struct sii8620 *ctx)
{ … }
static void sii8620_got_xdevcap(struct sii8620 *ctx, int ret)
{ … }
static void sii8620_irq_tdm(struct sii8620 *ctx)
{ … }
static void sii8620_irq_block(struct sii8620 *ctx)
{ … }
static void sii8620_irq_ddc(struct sii8620 *ctx)
{ … }
static bool sii8620_test_bit(unsigned int nr, const u8 *addr)
{ … }
static irqreturn_t sii8620_irq_thread(int irq, void *data)
{ … }
static void sii8620_cable_in(struct sii8620 *ctx)
{ … }
static void sii8620_init_rcp_input_dev(struct sii8620 *ctx)
{ … }
static void sii8620_cable_out(struct sii8620 *ctx)
{ … }
static void sii8620_extcon_work(struct work_struct *work)
{ … }
static int sii8620_extcon_notifier(struct notifier_block *self,
unsigned long event, void *ptr)
{ … }
static int sii8620_extcon_init(struct sii8620 *ctx)
{ … }
static inline struct sii8620 *bridge_to_sii8620(struct drm_bridge *bridge)
{ … }
static int sii8620_attach(struct drm_bridge *bridge,
enum drm_bridge_attach_flags flags)
{ … }
static void sii8620_detach(struct drm_bridge *bridge)
{ … }
static int sii8620_is_packing_required(struct sii8620 *ctx,
const struct drm_display_mode *mode)
{ … }
static enum drm_mode_status sii8620_mode_valid(struct drm_bridge *bridge,
const struct drm_display_info *info,
const struct drm_display_mode *mode)
{ … }
static bool sii8620_mode_fixup(struct drm_bridge *bridge,
const struct drm_display_mode *mode,
struct drm_display_mode *adjusted_mode)
{ … }
static const struct drm_bridge_funcs sii8620_bridge_funcs = …;
static int sii8620_probe(struct i2c_client *client)
{ … }
static void sii8620_remove(struct i2c_client *client)
{ … }
static const struct of_device_id sii8620_dt_match[] = …;
MODULE_DEVICE_TABLE(of, sii8620_dt_match);
static const struct i2c_device_id sii8620_id[] = …;
MODULE_DEVICE_TABLE(i2c, sii8620_id);
static struct i2c_driver sii8620_driver = …;
module_i2c_driver(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;