Lines Matching refs:sii902x
173 struct sii902x { struct
242 static inline struct sii902x *bridge_to_sii902x(struct drm_bridge *bridge) in bridge_to_sii902x()
244 return container_of(bridge, struct sii902x, bridge); in bridge_to_sii902x()
247 static inline struct sii902x *connector_to_sii902x(struct drm_connector *con) in connector_to_sii902x()
249 return container_of(con, struct sii902x, connector); in connector_to_sii902x()
252 static void sii902x_reset(struct sii902x *sii902x) in sii902x_reset() argument
254 if (!sii902x->reset_gpio) in sii902x_reset()
257 gpiod_set_value(sii902x->reset_gpio, 1); in sii902x_reset()
262 gpiod_set_value(sii902x->reset_gpio, 0); in sii902x_reset()
268 struct sii902x *sii902x = connector_to_sii902x(connector); in sii902x_connector_detect() local
271 mutex_lock(&sii902x->mutex); in sii902x_connector_detect()
273 regmap_read(sii902x->regmap, SII902X_INT_STATUS, &status); in sii902x_connector_detect()
275 mutex_unlock(&sii902x->mutex); in sii902x_connector_detect()
335 struct sii902x *sii902x = connector_to_sii902x(connector); in sii902x_get_modes() local
341 mutex_lock(&sii902x->mutex); in sii902x_get_modes()
343 edid = drm_get_edid(connector, sii902x->i2cmux->adapter[0]); in sii902x_get_modes()
368 &sii902x->bus_format, 1); in sii902x_get_modes()
372 ret = regmap_update_bits(sii902x->regmap, SII902X_SYS_CTRL_DATA, in sii902x_get_modes()
380 mutex_unlock(&sii902x->mutex); in sii902x_get_modes()
403 struct sii902x *sii902x = bridge_to_sii902x(bridge); in sii902x_bridge_disable() local
405 mutex_lock(&sii902x->mutex); in sii902x_bridge_disable()
407 regmap_update_bits(sii902x->regmap, SII902X_SYS_CTRL_DATA, in sii902x_bridge_disable()
411 mutex_unlock(&sii902x->mutex); in sii902x_bridge_disable()
416 struct sii902x *sii902x = bridge_to_sii902x(bridge); in sii902x_bridge_enable() local
418 mutex_lock(&sii902x->mutex); in sii902x_bridge_enable()
420 regmap_update_bits(sii902x->regmap, SII902X_PWR_STATE_CTRL, in sii902x_bridge_enable()
423 regmap_update_bits(sii902x->regmap, SII902X_SYS_CTRL_DATA, in sii902x_bridge_enable()
426 mutex_unlock(&sii902x->mutex); in sii902x_bridge_enable()
446 static void sii902x_set_embedded_sync(struct sii902x *sii902x) in sii902x_set_embedded_sync() argument
451 if (!sii902x_check_embedded_format(sii902x->bus_format)) in sii902x_set_embedded_sync()
454 switch (sii902x->bus_format) { in sii902x_set_embedded_sync()
459 sii902x_update_bits_unlocked(sii902x->i2c, SII902X_TPI_SYNC_GEN_CTRL, in sii902x_set_embedded_sync()
466 sii902x_update_bits_unlocked(sii902x->i2c, SII902X_TPI_SYNC_GEN_CTRL, in sii902x_set_embedded_sync()
468 regmap_write(sii902x->regmap, in sii902x_set_embedded_sync()
470 sii902x_update_bits_unlocked(sii902x->i2c, SII902X_TPI_SYNC_GEN_CTRL, in sii902x_set_embedded_sync()
473 drm_display_mode_to_videomode(&sii902x->mode, &vm); in sii902x_set_embedded_sync()
476 if (sii902x->mode.flags & DRM_MODE_FLAG_INTERLACE) { in sii902x_set_embedded_sync()
477 data[2] = (sii902x->mode.vtotal >> 1) & 0xff; in sii902x_set_embedded_sync()
478 data[3] = ((sii902x->mode.vtotal >> 1) >> 8) & 0x1f; in sii902x_set_embedded_sync()
487 regmap_bulk_write(sii902x->regmap, SII902X_TPI_HBIT_TO_HSYNC, data, 8); in sii902x_set_embedded_sync()
489 sii902x_update_bits_unlocked(sii902x->i2c, SII902X_TPI_SYNC_GEN_CTRL, in sii902x_set_embedded_sync()
491 sii902x_update_bits_unlocked(sii902x->i2c, in sii902x_set_embedded_sync()
495 regmap_update_bits(sii902x->regmap, in sii902x_set_embedded_sync()
501 static void sii902x_set_format(struct sii902x *sii902x) in sii902x_set_format() argument
505 switch (sii902x->bus_format) { in sii902x_set_format()
529 regmap_write(sii902x->regmap, SII902X_TPI_AVI_IN_FORMAT, val); in sii902x_set_format()
531 sii902x_set_embedded_sync(sii902x); in sii902x_set_format()
538 struct sii902x *sii902x = bridge_to_sii902x(bridge); in sii902x_bridge_mode_set() local
539 struct regmap *regmap = sii902x->regmap; in sii902x_bridge_mode_set()
545 drm_mode_copy(&sii902x->mode, adj); in sii902x_bridge_mode_set()
557 switch (sii902x->bus_format) { in sii902x_bridge_mode_set()
573 switch (sii902x->bus_format) { in sii902x_bridge_mode_set()
594 mutex_lock(&sii902x->mutex); in sii902x_bridge_mode_set()
601 &sii902x->connector, adj); in sii902x_bridge_mode_set()
617 sii902x_set_format(sii902x); in sii902x_bridge_mode_set()
619 mutex_unlock(&sii902x->mutex); in sii902x_bridge_mode_set()
625 struct sii902x *sii902x = bridge_to_sii902x(bridge); in sii902x_bridge_attach() local
634 sii902x->connector.interlace_allowed = true; in sii902x_bridge_attach()
635 drm_connector_helper_add(&sii902x->connector, in sii902x_bridge_attach()
639 dev_err(&sii902x->i2c->dev, in sii902x_bridge_attach()
644 ret = drm_connector_init(drm, &sii902x->connector, in sii902x_bridge_attach()
650 if (sii902x->i2c->irq > 0) in sii902x_bridge_attach()
651 sii902x->connector.polled = DRM_CONNECTOR_POLL_HPD; in sii902x_bridge_attach()
653 sii902x->connector.polled = DRM_CONNECTOR_POLL_CONNECT; in sii902x_bridge_attach()
655 drm_connector_attach_encoder(&sii902x->connector, bridge->encoder); in sii902x_bridge_attach()
667 static int sii902x_mute(struct sii902x *sii902x, bool mute) in sii902x_mute() argument
669 struct device *dev = &sii902x->i2c->dev; in sii902x_mute()
675 return regmap_update_bits(sii902x->regmap, in sii902x_mute()
724 struct sii902x *sii902x = dev_get_drvdata(dev); in sii902x_audio_hw_params() local
795 ret = clk_prepare_enable(sii902x->audio.mclk); in sii902x_audio_hw_params()
801 if (sii902x->audio.mclk) { in sii902x_audio_hw_params()
802 mclk_rate = clk_get_rate(sii902x->audio.mclk); in sii902x_audio_hw_params()
810 mutex_lock(&sii902x->mutex); in sii902x_audio_hw_params()
812 ret = regmap_write(sii902x->regmap, in sii902x_audio_hw_params()
818 ret = regmap_write(sii902x->regmap, SII902X_TPI_I2S_INPUT_CONFIG_REG, in sii902x_audio_hw_params()
823 for (i = 0; i < ARRAY_SIZE(sii902x->audio.i2s_fifo_sequence) && in sii902x_audio_hw_params()
824 sii902x->audio.i2s_fifo_sequence[i]; i++) in sii902x_audio_hw_params()
825 regmap_write(sii902x->regmap, in sii902x_audio_hw_params()
827 sii902x->audio.i2s_fifo_sequence[i]); in sii902x_audio_hw_params()
829 ret = regmap_write(sii902x->regmap, SII902X_TPI_AUDIO_CONFIG_BYTE3_REG, in sii902x_audio_hw_params()
834 ret = regmap_bulk_write(sii902x->regmap, SII902X_TPI_I2S_STRM_HDR_BASE, in sii902x_audio_hw_params()
849 ret = regmap_bulk_write(sii902x->regmap, in sii902x_audio_hw_params()
857 ret = regmap_write(sii902x->regmap, SII902X_IND_SET_PAGE, 0x02); in sii902x_audio_hw_params()
861 ret = regmap_write(sii902x->regmap, SII902X_IND_OFFSET, 0x24); in sii902x_audio_hw_params()
865 ret = regmap_write(sii902x->regmap, SII902X_IND_VALUE, 0x02); in sii902x_audio_hw_params()
871 mutex_unlock(&sii902x->mutex); in sii902x_audio_hw_params()
874 clk_disable_unprepare(sii902x->audio.mclk); in sii902x_audio_hw_params()
884 struct sii902x *sii902x = dev_get_drvdata(dev); in sii902x_audio_shutdown() local
886 mutex_lock(&sii902x->mutex); in sii902x_audio_shutdown()
888 regmap_write(sii902x->regmap, SII902X_TPI_AUDIO_CONFIG_BYTE2_REG, in sii902x_audio_shutdown()
891 mutex_unlock(&sii902x->mutex); in sii902x_audio_shutdown()
893 clk_disable_unprepare(sii902x->audio.mclk); in sii902x_audio_shutdown()
899 struct sii902x *sii902x = dev_get_drvdata(dev); in sii902x_audio_mute() local
901 mutex_lock(&sii902x->mutex); in sii902x_audio_mute()
903 sii902x_mute(sii902x, enable); in sii902x_audio_mute()
905 mutex_unlock(&sii902x->mutex); in sii902x_audio_mute()
913 struct sii902x *sii902x = dev_get_drvdata(dev); in sii902x_audio_get_eld() local
915 mutex_lock(&sii902x->mutex); in sii902x_audio_get_eld()
917 memcpy(buf, sii902x->connector.eld, in sii902x_audio_get_eld()
918 min(sizeof(sii902x->connector.eld), len)); in sii902x_audio_get_eld()
920 mutex_unlock(&sii902x->mutex); in sii902x_audio_get_eld()
954 static int sii902x_audio_codec_init(struct sii902x *sii902x, in sii902x_audio_codec_init() argument
1004 sii902x->audio.i2s_fifo_sequence[i] |= audio_fifo_id[i] | in sii902x_audio_codec_init()
1007 sii902x->audio.mclk = devm_clk_get_optional(dev, "mclk"); in sii902x_audio_codec_init()
1008 if (IS_ERR(sii902x->audio.mclk)) { in sii902x_audio_codec_init()
1010 __func__, PTR_ERR(sii902x->audio.mclk)); in sii902x_audio_codec_init()
1011 return PTR_ERR(sii902x->audio.mclk); in sii902x_audio_codec_init()
1014 sii902x->audio.pdev = platform_device_register_data( in sii902x_audio_codec_init()
1018 return PTR_ERR_OR_ZERO(sii902x->audio.pdev); in sii902x_audio_codec_init()
1041 struct sii902x *sii902x = data; in sii902x_interrupt() local
1044 mutex_lock(&sii902x->mutex); in sii902x_interrupt()
1046 regmap_read(sii902x->regmap, SII902X_INT_STATUS, &status); in sii902x_interrupt()
1047 regmap_write(sii902x->regmap, SII902X_INT_STATUS, status); in sii902x_interrupt()
1049 mutex_unlock(&sii902x->mutex); in sii902x_interrupt()
1051 if ((status & SII902X_HOTPLUG_EVENT) && sii902x->bridge.dev) in sii902x_interrupt()
1052 drm_helper_hpd_irq_event(sii902x->bridge.dev); in sii902x_interrupt()
1071 struct sii902x *sii902x = i2c_mux_priv(mux); in sii902x_i2c_bypass_select() local
1072 struct device *dev = &sii902x->i2c->dev; in sii902x_i2c_bypass_select()
1077 ret = sii902x_update_bits_unlocked(sii902x->i2c, SII902X_SYS_CTRL_DATA, in sii902x_i2c_bypass_select()
1086 ret = sii902x_read_unlocked(sii902x->i2c, SII902X_SYS_CTRL_DATA, in sii902x_i2c_bypass_select()
1098 return sii902x_write_unlocked(sii902x->i2c, SII902X_SYS_CTRL_DATA, in sii902x_i2c_bypass_select()
1116 struct sii902x *sii902x = i2c_mux_priv(mux); in sii902x_i2c_bypass_deselect() local
1117 struct device *dev = &sii902x->i2c->dev; in sii902x_i2c_bypass_deselect()
1137 ret = sii902x_read_unlocked(sii902x->i2c, SII902X_SYS_CTRL_DATA, in sii902x_i2c_bypass_deselect()
1146 ret = sii902x_update_bits_unlocked(sii902x->i2c, SII902X_SYS_CTRL_DATA, in sii902x_i2c_bypass_deselect()
1155 ret = sii902x_read_unlocked(sii902x->i2c, SII902X_SYS_CTRL_DATA, in sii902x_i2c_bypass_deselect()
1178 static int sii902x_init(struct sii902x *sii902x) in sii902x_init() argument
1180 struct device *dev = &sii902x->i2c->dev; in sii902x_init()
1185 sii902x_reset(sii902x); in sii902x_init()
1187 ret = regmap_write(sii902x->regmap, SII902X_REG_TPI_RQB, 0x0); in sii902x_init()
1193 ret = regmap_bulk_read(sii902x->regmap, SII902X_REG_CHIPID(0), in sii902x_init()
1207 regmap_read(sii902x->regmap, SII902X_INT_STATUS, &status); in sii902x_init()
1208 regmap_write(sii902x->regmap, SII902X_INT_STATUS, status); in sii902x_init()
1210 if (sii902x->i2c->irq > 0) { in sii902x_init()
1211 regmap_write(sii902x->regmap, SII902X_INT_ENABLE, in sii902x_init()
1214 ret = devm_request_threaded_irq(dev, sii902x->i2c->irq, NULL, in sii902x_init()
1218 sii902x); in sii902x_init()
1223 sii902x->bridge.funcs = &sii902x_bridge_funcs; in sii902x_init()
1224 sii902x->bridge.of_node = dev->of_node; in sii902x_init()
1225 sii902x->bridge.timings = &default_sii902x_timings; in sii902x_init()
1226 drm_bridge_add(&sii902x->bridge); in sii902x_init()
1228 sii902x_audio_codec_init(sii902x, dev); in sii902x_init()
1230 i2c_set_clientdata(sii902x->i2c, sii902x); in sii902x_init()
1232 sii902x->i2cmux = i2c_mux_alloc(sii902x->i2c->adapter, dev, in sii902x_init()
1236 if (!sii902x->i2cmux) in sii902x_init()
1239 sii902x->i2cmux->priv = sii902x; in sii902x_init()
1240 return i2c_mux_add_adapter(sii902x->i2cmux, 0, 0, 0); in sii902x_init()
1247 struct sii902x *sii902x; in sii902x_probe() local
1258 sii902x = devm_kzalloc(dev, sizeof(*sii902x), GFP_KERNEL); in sii902x_probe()
1259 if (!sii902x) in sii902x_probe()
1262 sii902x->i2c = client; in sii902x_probe()
1263 sii902x->regmap = devm_regmap_init_i2c(client, &sii902x_regmap_config); in sii902x_probe()
1264 if (IS_ERR(sii902x->regmap)) in sii902x_probe()
1265 return PTR_ERR(sii902x->regmap); in sii902x_probe()
1267 sii902x->reset_gpio = devm_gpiod_get_optional(dev, "reset", in sii902x_probe()
1269 if (IS_ERR(sii902x->reset_gpio)) { in sii902x_probe()
1271 PTR_ERR(sii902x->reset_gpio)); in sii902x_probe()
1272 return PTR_ERR(sii902x->reset_gpio); in sii902x_probe()
1275 sii902x->enable_gpio = devm_gpiod_get_optional(dev, "enable", in sii902x_probe()
1277 if (IS_ERR(sii902x->enable_gpio)) { in sii902x_probe()
1279 PTR_ERR(sii902x->enable_gpio)); in sii902x_probe()
1280 return PTR_ERR(sii902x->enable_gpio); in sii902x_probe()
1281 } else if (sii902x->enable_gpio) { in sii902x_probe()
1282 gpiod_direction_output(sii902x->enable_gpio, 1); in sii902x_probe()
1288 sii902x->bus_format = MEDIA_BUS_FMT_RGB888_1X24; in sii902x_probe()
1292 sii902x->bus_format = MEDIA_BUS_FMT_RGB888_1X24; in sii902x_probe()
1295 sii902x->bus_format = MEDIA_BUS_FMT_YUYV8_1X16; in sii902x_probe()
1298 sii902x->bus_format = MEDIA_BUS_FMT_YUV8_1X24; in sii902x_probe()
1301 sii902x->bus_format = val; in sii902x_probe()
1306 mutex_init(&sii902x->mutex); in sii902x_probe()
1308 sii902x->supplies[0].supply = "iovcc"; in sii902x_probe()
1309 sii902x->supplies[1].supply = "cvcc12"; in sii902x_probe()
1310 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(sii902x->supplies), in sii902x_probe()
1311 sii902x->supplies); in sii902x_probe()
1315 ret = regulator_bulk_enable(ARRAY_SIZE(sii902x->supplies), in sii902x_probe()
1316 sii902x->supplies); in sii902x_probe()
1322 ret = sii902x_init(sii902x); in sii902x_probe()
1325 regulator_bulk_disable(ARRAY_SIZE(sii902x->supplies), in sii902x_probe()
1326 sii902x->supplies); in sii902x_probe()
1335 struct sii902x *sii902x = i2c_get_clientdata(client); in sii902x_remove() local
1337 i2c_mux_del_adapters(sii902x->i2cmux); in sii902x_remove()
1338 drm_bridge_remove(&sii902x->bridge); in sii902x_remove()
1339 regulator_bulk_disable(ARRAY_SIZE(sii902x->supplies), in sii902x_remove()
1340 sii902x->supplies); in sii902x_remove()