Lines Matching defs:sii902x

166 struct sii902x {
227 static inline struct sii902x *bridge_to_sii902x(struct drm_bridge *bridge)
229 return container_of(bridge, struct sii902x, bridge);
232 static inline struct sii902x *connector_to_sii902x(struct drm_connector *con)
234 return container_of(con, struct sii902x, connector);
237 static void sii902x_reset(struct sii902x *sii902x)
239 if (!sii902x->reset_gpio)
242 gpiod_set_value_cansleep(sii902x->reset_gpio, 1);
247 gpiod_set_value_cansleep(sii902x->reset_gpio, 0);
250 static enum drm_connector_status sii902x_detect(struct sii902x *sii902x)
254 mutex_lock(&sii902x->mutex);
256 regmap_read(sii902x->regmap, SII902X_INT_STATUS, &status);
258 mutex_unlock(&sii902x->mutex);
267 struct sii902x *sii902x = connector_to_sii902x(connector);
269 return sii902x_detect(sii902x);
281 static const struct drm_edid *sii902x_edid_read(struct sii902x *sii902x,
286 mutex_lock(&sii902x->mutex);
288 drm_edid = drm_edid_read_ddc(connector, sii902x->i2cmux->adapter[0]);
290 mutex_unlock(&sii902x->mutex);
297 struct sii902x *sii902x = connector_to_sii902x(connector);
301 drm_edid = sii902x_edid_read(sii902x, connector);
308 sii902x->sink_is_hdmi = connector->display_info.is_hdmi;
328 struct sii902x *sii902x = bridge_to_sii902x(bridge);
330 mutex_lock(&sii902x->mutex);
332 regmap_update_bits(sii902x->regmap, SII902X_SYS_CTRL_DATA,
336 mutex_unlock(&sii902x->mutex);
341 struct sii902x *sii902x = bridge_to_sii902x(bridge);
343 mutex_lock(&sii902x->mutex);
345 regmap_update_bits(sii902x->regmap, SII902X_PWR_STATE_CTRL,
348 regmap_update_bits(sii902x->regmap, SII902X_SYS_CTRL_DATA,
351 mutex_unlock(&sii902x->mutex);
358 struct sii902x *sii902x = bridge_to_sii902x(bridge);
360 struct regmap *regmap = sii902x->regmap;
366 if (sii902x->sink_is_hdmi)
382 mutex_lock(&sii902x->mutex);
384 ret = regmap_update_bits(sii902x->regmap, SII902X_SYS_CTRL_DATA,
394 &sii902x->connector, adj);
412 mutex_unlock(&sii902x->mutex);
418 struct sii902x *sii902x = bridge_to_sii902x(bridge);
424 return drm_bridge_attach(bridge->encoder, sii902x->next_bridge,
427 drm_connector_helper_add(&sii902x->connector,
431 dev_err(&sii902x->i2c->dev,
432 "sii902x driver is only compatible with DRM devices supporting atomic updates\n");
436 ret = drm_connector_init(drm, &sii902x->connector,
442 if (sii902x->i2c->irq > 0)
443 sii902x->connector.polled = DRM_CONNECTOR_POLL_HPD;
445 sii902x->connector.polled = DRM_CONNECTOR_POLL_CONNECT;
447 ret = drm_display_info_set_bus_formats(&sii902x->connector.display_info,
452 drm_connector_attach_encoder(&sii902x->connector, bridge->encoder);
459 struct sii902x *sii902x = bridge_to_sii902x(bridge);
461 return sii902x_detect(sii902x);
467 struct sii902x *sii902x = bridge_to_sii902x(bridge);
469 return sii902x_edid_read(sii902x, connector);
521 static int sii902x_mute(struct sii902x *sii902x, bool mute)
523 struct device *dev = &sii902x->i2c->dev;
529 return regmap_update_bits(sii902x->regmap,
578 struct sii902x *sii902x = dev_get_drvdata(dev);
650 ret = clk_prepare_enable(sii902x->audio.mclk);
656 if (sii902x->audio.mclk) {
657 mclk_rate = clk_get_rate(sii902x->audio.mclk);
665 mutex_lock(&sii902x->mutex);
667 ret = regmap_write(sii902x->regmap,
673 ret = regmap_write(sii902x->regmap, SII902X_TPI_I2S_INPUT_CONFIG_REG,
678 for (i = 0; i < ARRAY_SIZE(sii902x->audio.i2s_fifo_sequence) &&
679 sii902x->audio.i2s_fifo_sequence[i]; i++)
680 regmap_write(sii902x->regmap,
682 sii902x->audio.i2s_fifo_sequence[i]);
684 ret = regmap_write(sii902x->regmap, SII902X_TPI_AUDIO_CONFIG_BYTE3_REG,
689 ret = regmap_bulk_write(sii902x->regmap, SII902X_TPI_I2S_STRM_HDR_BASE,
704 ret = regmap_bulk_write(sii902x->regmap,
712 ret = regmap_write(sii902x->regmap, SII902X_IND_SET_PAGE, 0x02);
716 ret = regmap_write(sii902x->regmap, SII902X_IND_OFFSET, 0x24);
720 ret = regmap_write(sii902x->regmap, SII902X_IND_VALUE, 0x02);
726 mutex_unlock(&sii902x->mutex);
729 clk_disable_unprepare(sii902x->audio.mclk);
739 struct sii902x *sii902x = dev_get_drvdata(dev);
741 mutex_lock(&sii902x->mutex);
743 regmap_write(sii902x->regmap, SII902X_TPI_AUDIO_CONFIG_BYTE2_REG,
746 mutex_unlock(&sii902x->mutex);
748 clk_disable_unprepare(sii902x->audio.mclk);
754 struct sii902x *sii902x = dev_get_drvdata(dev);
756 mutex_lock(&sii902x->mutex);
758 sii902x_mute(sii902x, enable);
760 mutex_unlock(&sii902x->mutex);
768 struct sii902x *sii902x = dev_get_drvdata(dev);
770 mutex_lock(&sii902x->mutex);
772 memcpy(buf, sii902x->connector.eld,
773 min(sizeof(sii902x->connector.eld), len));
775 mutex_unlock(&sii902x->mutex);
809 static int sii902x_audio_codec_init(struct sii902x *sii902x,
859 sii902x->audio.i2s_fifo_sequence[i] |= audio_fifo_id[i] |
862 sii902x->audio.mclk = devm_clk_get_optional(dev, "mclk");
863 if (IS_ERR(sii902x->audio.mclk)) {
865 __func__, PTR_ERR(sii902x->audio.mclk));
866 return PTR_ERR(sii902x->audio.mclk);
869 sii902x->audio.pdev = platform_device_register_data(
873 return PTR_ERR_OR_ZERO(sii902x->audio.pdev);
888 .disable_locking = true, /* struct sii902x mutex should be enough */
896 struct sii902x *sii902x = data;
899 mutex_lock(&sii902x->mutex);
901 regmap_read(sii902x->regmap, SII902X_INT_STATUS, &status);
902 regmap_write(sii902x->regmap, SII902X_INT_STATUS, status);
904 mutex_unlock(&sii902x->mutex);
906 if ((status & SII902X_HOTPLUG_EVENT) && sii902x->bridge.dev) {
907 drm_helper_hpd_irq_event(sii902x->bridge.dev);
908 drm_bridge_hpd_notify(&sii902x->bridge, (status & SII902X_PLUGGED_STATUS)
930 struct sii902x *sii902x = i2c_mux_priv(mux);
931 struct device *dev = &sii902x->i2c->dev;
936 ret = sii902x_update_bits_unlocked(sii902x->i2c, SII902X_SYS_CTRL_DATA,
945 ret = sii902x_read_unlocked(sii902x->i2c, SII902X_SYS_CTRL_DATA,
957 return sii902x_write_unlocked(sii902x->i2c, SII902X_SYS_CTRL_DATA,
975 struct sii902x *sii902x = i2c_mux_priv(mux);
976 struct device *dev = &sii902x->i2c->dev;
996 ret = sii902x_read_unlocked(sii902x->i2c, SII902X_SYS_CTRL_DATA,
1005 ret = sii902x_update_bits_unlocked(sii902x->i2c, SII902X_SYS_CTRL_DATA,
1014 ret = sii902x_read_unlocked(sii902x->i2c, SII902X_SYS_CTRL_DATA,
1037 static int sii902x_init(struct sii902x *sii902x)
1039 struct device *dev = &sii902x->i2c->dev;
1044 sii902x_reset(sii902x);
1046 ret = regmap_write(sii902x->regmap, SII902X_REG_TPI_RQB, 0x0);
1050 ret = regmap_bulk_read(sii902x->regmap, SII902X_REG_CHIPID(0),
1064 regmap_read(sii902x->regmap, SII902X_INT_STATUS, &status);
1065 regmap_write(sii902x->regmap, SII902X_INT_STATUS, status);
1067 if (sii902x->i2c->irq > 0) {
1068 regmap_write(sii902x->regmap, SII902X_INT_ENABLE,
1071 ret = devm_request_threaded_irq(dev, sii902x->i2c->irq, NULL,
1074 sii902x);
1079 ret = sii902x_audio_codec_init(sii902x, dev);
1083 i2c_set_clientdata(sii902x->i2c, sii902x);
1085 sii902x->i2cmux = i2c_mux_alloc(sii902x->i2c->adapter, dev,
1089 if (!sii902x->i2cmux) {
1094 sii902x->i2cmux->priv = sii902x;
1095 ret = i2c_mux_add_adapter(sii902x->i2cmux, 0, 0);
1099 sii902x->bridge.funcs = &sii902x_bridge_funcs;
1100 sii902x->bridge.of_node = dev->of_node;
1101 sii902x->bridge.timings = &default_sii902x_timings;
1102 sii902x->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID;
1104 if (sii902x->i2c->irq > 0)
1105 sii902x->bridge.ops |= DRM_BRIDGE_OP_HPD;
1107 drm_bridge_add(&sii902x->bridge);
1112 if (!PTR_ERR_OR_ZERO(sii902x->audio.pdev))
1113 platform_device_unregister(sii902x->audio.pdev);
1122 struct sii902x *sii902x;
1133 sii902x = devm_kzalloc(dev, sizeof(*sii902x), GFP_KERNEL);
1134 if (!sii902x)
1137 sii902x->i2c = client;
1138 sii902x->regmap = devm_regmap_init_i2c(client, &sii902x_regmap_config);
1139 if (IS_ERR(sii902x->regmap))
1140 return PTR_ERR(sii902x->regmap);
1142 sii902x->reset_gpio = devm_gpiod_get_optional(dev, "reset",
1144 if (IS_ERR(sii902x->reset_gpio)) {
1146 PTR_ERR(sii902x->reset_gpio));
1147 return PTR_ERR(sii902x->reset_gpio);
1166 sii902x->next_bridge = of_drm_find_bridge(remote);
1168 if (!sii902x->next_bridge)
1173 mutex_init(&sii902x->mutex);
1179 return sii902x_init(sii902x);
1184 struct sii902x *sii902x = i2c_get_clientdata(client);
1186 drm_bridge_remove(&sii902x->bridge);
1187 i2c_mux_del_adapters(sii902x->i2cmux);
1189 if (!PTR_ERR_OR_ZERO(sii902x->audio.pdev))
1190 platform_device_unregister(sii902x->audio.pdev);
1209 .name = "sii902x",