Lines Matching defs:sii902x
165 struct sii902x {
225 static inline struct sii902x *bridge_to_sii902x(struct drm_bridge *bridge)
227 return container_of(bridge, struct sii902x, bridge);
230 static inline struct sii902x *connector_to_sii902x(struct drm_connector *con)
232 return container_of(con, struct sii902x, connector);
235 static void sii902x_reset(struct sii902x *sii902x)
237 if (!sii902x->reset_gpio)
240 gpiod_set_value(sii902x->reset_gpio, 1);
245 gpiod_set_value(sii902x->reset_gpio, 0);
251 struct sii902x *sii902x = connector_to_sii902x(connector);
254 mutex_lock(&sii902x->mutex);
256 regmap_read(sii902x->regmap, SII902X_INT_STATUS, &status);
258 mutex_unlock(&sii902x->mutex);
275 struct sii902x *sii902x = connector_to_sii902x(connector);
281 mutex_lock(&sii902x->mutex);
283 edid = drm_get_edid(connector, sii902x->i2cmux->adapter[0]);
298 ret = regmap_update_bits(sii902x->regmap, SII902X_SYS_CTRL_DATA,
306 mutex_unlock(&sii902x->mutex);
326 struct sii902x *sii902x = bridge_to_sii902x(bridge);
328 mutex_lock(&sii902x->mutex);
330 regmap_update_bits(sii902x->regmap, SII902X_SYS_CTRL_DATA,
334 mutex_unlock(&sii902x->mutex);
339 struct sii902x *sii902x = bridge_to_sii902x(bridge);
341 mutex_lock(&sii902x->mutex);
343 regmap_update_bits(sii902x->regmap, SII902X_PWR_STATE_CTRL,
346 regmap_update_bits(sii902x->regmap, SII902X_SYS_CTRL_DATA,
349 mutex_unlock(&sii902x->mutex);
356 struct sii902x *sii902x = bridge_to_sii902x(bridge);
357 struct regmap *regmap = sii902x->regmap;
376 mutex_lock(&sii902x->mutex);
383 &sii902x->connector, adj);
401 mutex_unlock(&sii902x->mutex);
407 struct sii902x *sii902x = bridge_to_sii902x(bridge);
416 drm_connector_helper_add(&sii902x->connector,
420 dev_err(&sii902x->i2c->dev,
421 "sii902x driver is only compatible with DRM devices supporting atomic updates\n");
425 ret = drm_connector_init(drm, &sii902x->connector,
431 if (sii902x->i2c->irq > 0)
432 sii902x->connector.polled = DRM_CONNECTOR_POLL_HPD;
434 sii902x->connector.polled = DRM_CONNECTOR_POLL_CONNECT;
436 drm_connector_attach_encoder(&sii902x->connector, bridge->encoder);
448 static int sii902x_mute(struct sii902x *sii902x, bool mute)
450 struct device *dev = &sii902x->i2c->dev;
456 return regmap_update_bits(sii902x->regmap,
505 struct sii902x *sii902x = dev_get_drvdata(dev);
576 ret = clk_prepare_enable(sii902x->audio.mclk);
582 if (sii902x->audio.mclk) {
583 mclk_rate = clk_get_rate(sii902x->audio.mclk);
591 mutex_lock(&sii902x->mutex);
593 ret = regmap_write(sii902x->regmap,
599 ret = regmap_write(sii902x->regmap, SII902X_TPI_I2S_INPUT_CONFIG_REG,
604 for (i = 0; i < ARRAY_SIZE(sii902x->audio.i2s_fifo_sequence) &&
605 sii902x->audio.i2s_fifo_sequence[i]; i++)
606 regmap_write(sii902x->regmap,
608 sii902x->audio.i2s_fifo_sequence[i]);
610 ret = regmap_write(sii902x->regmap, SII902X_TPI_AUDIO_CONFIG_BYTE3_REG,
615 ret = regmap_bulk_write(sii902x->regmap, SII902X_TPI_I2S_STRM_HDR_BASE,
630 ret = regmap_bulk_write(sii902x->regmap,
638 ret = regmap_write(sii902x->regmap, SII902X_IND_SET_PAGE, 0x02);
642 ret = regmap_write(sii902x->regmap, SII902X_IND_OFFSET, 0x24);
646 ret = regmap_write(sii902x->regmap, SII902X_IND_VALUE, 0x02);
652 mutex_unlock(&sii902x->mutex);
655 clk_disable_unprepare(sii902x->audio.mclk);
665 struct sii902x *sii902x = dev_get_drvdata(dev);
667 mutex_lock(&sii902x->mutex);
669 regmap_write(sii902x->regmap, SII902X_TPI_AUDIO_CONFIG_BYTE2_REG,
672 mutex_unlock(&sii902x->mutex);
674 clk_disable_unprepare(sii902x->audio.mclk);
680 struct sii902x *sii902x = dev_get_drvdata(dev);
682 mutex_lock(&sii902x->mutex);
684 sii902x_mute(sii902x, enable);
686 mutex_unlock(&sii902x->mutex);
694 struct sii902x *sii902x = dev_get_drvdata(dev);
696 mutex_lock(&sii902x->mutex);
698 memcpy(buf, sii902x->connector.eld,
699 min(sizeof(sii902x->connector.eld), len));
701 mutex_unlock(&sii902x->mutex);
735 static int sii902x_audio_codec_init(struct sii902x *sii902x,
785 sii902x->audio.i2s_fifo_sequence[i] |= audio_fifo_id[i] |
788 sii902x->audio.mclk = devm_clk_get_optional(dev, "mclk");
789 if (IS_ERR(sii902x->audio.mclk)) {
791 __func__, PTR_ERR(sii902x->audio.mclk));
792 return PTR_ERR(sii902x->audio.mclk);
795 sii902x->audio.pdev = platform_device_register_data(
799 return PTR_ERR_OR_ZERO(sii902x->audio.pdev);
814 .disable_locking = true, /* struct sii902x mutex should be enough */
822 struct sii902x *sii902x = data;
825 mutex_lock(&sii902x->mutex);
827 regmap_read(sii902x->regmap, SII902X_INT_STATUS, &status);
828 regmap_write(sii902x->regmap, SII902X_INT_STATUS, status);
830 mutex_unlock(&sii902x->mutex);
832 if ((status & SII902X_HOTPLUG_EVENT) && sii902x->bridge.dev)
833 drm_helper_hpd_irq_event(sii902x->bridge.dev);
852 struct sii902x *sii902x = i2c_mux_priv(mux);
853 struct device *dev = &sii902x->i2c->dev;
858 ret = sii902x_update_bits_unlocked(sii902x->i2c, SII902X_SYS_CTRL_DATA,
867 ret = sii902x_read_unlocked(sii902x->i2c, SII902X_SYS_CTRL_DATA,
879 return sii902x_write_unlocked(sii902x->i2c, SII902X_SYS_CTRL_DATA,
897 struct sii902x *sii902x = i2c_mux_priv(mux);
898 struct device *dev = &sii902x->i2c->dev;
918 ret = sii902x_read_unlocked(sii902x->i2c, SII902X_SYS_CTRL_DATA,
927 ret = sii902x_update_bits_unlocked(sii902x->i2c, SII902X_SYS_CTRL_DATA,
936 ret = sii902x_read_unlocked(sii902x->i2c, SII902X_SYS_CTRL_DATA,
959 static int sii902x_init(struct sii902x *sii902x)
961 struct device *dev = &sii902x->i2c->dev;
966 sii902x_reset(sii902x);
968 ret = regmap_write(sii902x->regmap, SII902X_REG_TPI_RQB, 0x0);
972 ret = regmap_bulk_read(sii902x->regmap, SII902X_REG_CHIPID(0),
986 regmap_read(sii902x->regmap, SII902X_INT_STATUS, &status);
987 regmap_write(sii902x->regmap, SII902X_INT_STATUS, status);
989 if (sii902x->i2c->irq > 0) {
990 regmap_write(sii902x->regmap, SII902X_INT_ENABLE,
993 ret = devm_request_threaded_irq(dev, sii902x->i2c->irq, NULL,
996 sii902x);
1001 sii902x->bridge.funcs = &sii902x_bridge_funcs;
1002 sii902x->bridge.of_node = dev->of_node;
1003 sii902x->bridge.timings = &default_sii902x_timings;
1004 drm_bridge_add(&sii902x->bridge);
1006 sii902x_audio_codec_init(sii902x, dev);
1008 i2c_set_clientdata(sii902x->i2c, sii902x);
1010 sii902x->i2cmux = i2c_mux_alloc(sii902x->i2c->adapter, dev,
1014 if (!sii902x->i2cmux)
1017 sii902x->i2cmux->priv = sii902x;
1018 return i2c_mux_add_adapter(sii902x->i2cmux, 0, 0, 0);
1025 struct sii902x *sii902x;
1035 sii902x = devm_kzalloc(dev, sizeof(*sii902x), GFP_KERNEL);
1036 if (!sii902x)
1039 sii902x->i2c = client;
1040 sii902x->regmap = devm_regmap_init_i2c(client, &sii902x_regmap_config);
1041 if (IS_ERR(sii902x->regmap))
1042 return PTR_ERR(sii902x->regmap);
1044 sii902x->reset_gpio = devm_gpiod_get_optional(dev, "reset",
1046 if (IS_ERR(sii902x->reset_gpio)) {
1048 PTR_ERR(sii902x->reset_gpio));
1049 return PTR_ERR(sii902x->reset_gpio);
1052 mutex_init(&sii902x->mutex);
1054 sii902x->supplies[0].supply = "iovcc";
1055 sii902x->supplies[1].supply = "cvcc12";
1056 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(sii902x->supplies),
1057 sii902x->supplies);
1061 ret = regulator_bulk_enable(ARRAY_SIZE(sii902x->supplies),
1062 sii902x->supplies);
1068 ret = sii902x_init(sii902x);
1070 regulator_bulk_disable(ARRAY_SIZE(sii902x->supplies),
1071 sii902x->supplies);
1080 struct sii902x *sii902x = i2c_get_clientdata(client);
1082 i2c_mux_del_adapters(sii902x->i2cmux);
1083 drm_bridge_remove(&sii902x->bridge);
1084 regulator_bulk_disable(ARRAY_SIZE(sii902x->supplies),
1085 sii902x->supplies);
1106 .name = "sii902x",