0001
0002
0003
0004
0005
0006 #include <linux/delay.h>
0007 #include <linux/err.h>
0008 #include <linux/gpio/consumer.h>
0009 #include <linux/i2c.h>
0010 #include <linux/module.h>
0011 #include <linux/of_graph.h>
0012 #include <linux/pm_runtime.h>
0013 #include <linux/regmap.h>
0014 #include <linux/regulator/consumer.h>
0015
0016 #include <drm/display/drm_dp_aux_bus.h>
0017 #include <drm/display/drm_dp_helper.h>
0018 #include <drm/drm_bridge.h>
0019 #include <drm/drm_edid.h>
0020 #include <drm/drm_mipi_dsi.h>
0021 #include <drm/drm_of.h>
0022 #include <drm/drm_panel.h>
0023 #include <drm/drm_print.h>
0024
0025 #define PAGE0_AUXCH_CFG3 0x76
0026 #define AUXCH_CFG3_RESET 0xff
0027 #define PAGE0_SWAUX_ADDR_7_0 0x7d
0028 #define PAGE0_SWAUX_ADDR_15_8 0x7e
0029 #define PAGE0_SWAUX_ADDR_23_16 0x7f
0030 #define SWAUX_ADDR_MASK GENMASK(19, 0)
0031 #define PAGE0_SWAUX_LENGTH 0x80
0032 #define SWAUX_LENGTH_MASK GENMASK(3, 0)
0033 #define SWAUX_NO_PAYLOAD BIT(7)
0034 #define PAGE0_SWAUX_WDATA 0x81
0035 #define PAGE0_SWAUX_RDATA 0x82
0036 #define PAGE0_SWAUX_CTRL 0x83
0037 #define SWAUX_SEND BIT(0)
0038 #define PAGE0_SWAUX_STATUS 0x84
0039 #define SWAUX_M_MASK GENMASK(4, 0)
0040 #define SWAUX_STATUS_MASK GENMASK(7, 5)
0041 #define SWAUX_STATUS_NACK (0x1 << 5)
0042 #define SWAUX_STATUS_DEFER (0x2 << 5)
0043 #define SWAUX_STATUS_ACKM (0x3 << 5)
0044 #define SWAUX_STATUS_INVALID (0x4 << 5)
0045 #define SWAUX_STATUS_I2C_NACK (0x5 << 5)
0046 #define SWAUX_STATUS_I2C_DEFER (0x6 << 5)
0047 #define SWAUX_STATUS_TIMEOUT (0x7 << 5)
0048
0049 #define PAGE2_GPIO_H 0xa7
0050 #define PS_GPIO9 BIT(1)
0051 #define PAGE2_I2C_BYPASS 0xea
0052 #define I2C_BYPASS_EN 0xd0
0053 #define PAGE2_MCS_EN 0xf3
0054 #define MCS_EN BIT(0)
0055
0056 #define PAGE3_SET_ADD 0xfe
0057 #define VDO_CTL_ADD 0x13
0058 #define VDO_DIS 0x18
0059 #define VDO_EN 0x1c
0060
0061 #define NUM_MIPI_LANES 4
0062
0063 #define COMMON_PS8640_REGMAP_CONFIG \
0064 .reg_bits = 8, \
0065 .val_bits = 8, \
0066 .cache_type = REGCACHE_NONE
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079 enum page_addr_offset {
0080 PAGE0_DP_CNTL = 0,
0081 PAGE1_VDO_BDG,
0082 PAGE2_TOP_CNTL,
0083 PAGE3_DSI_CNTL1,
0084 PAGE4_MIPI_PHY,
0085 PAGE5_VPLL,
0086 PAGE6_DSI_CNTL2,
0087 PAGE7_SPI_CNTL,
0088 MAX_DEVS
0089 };
0090
0091 enum ps8640_vdo_control {
0092 DISABLE = VDO_DIS,
0093 ENABLE = VDO_EN,
0094 };
0095
0096 struct ps8640 {
0097 struct drm_bridge bridge;
0098 struct drm_bridge *panel_bridge;
0099 struct drm_dp_aux aux;
0100 struct mipi_dsi_device *dsi;
0101 struct i2c_client *page[MAX_DEVS];
0102 struct regmap *regmap[MAX_DEVS];
0103 struct regulator_bulk_data supplies[2];
0104 struct gpio_desc *gpio_reset;
0105 struct gpio_desc *gpio_powerdown;
0106 struct device_link *link;
0107 bool pre_enabled;
0108 };
0109
0110 static const struct regmap_config ps8640_regmap_config[] = {
0111 [PAGE0_DP_CNTL] = {
0112 COMMON_PS8640_REGMAP_CONFIG,
0113 .max_register = 0xbf,
0114 },
0115 [PAGE1_VDO_BDG] = {
0116 COMMON_PS8640_REGMAP_CONFIG,
0117 .max_register = 0xff,
0118 },
0119 [PAGE2_TOP_CNTL] = {
0120 COMMON_PS8640_REGMAP_CONFIG,
0121 .max_register = 0xff,
0122 },
0123 [PAGE3_DSI_CNTL1] = {
0124 COMMON_PS8640_REGMAP_CONFIG,
0125 .max_register = 0xff,
0126 },
0127 [PAGE4_MIPI_PHY] = {
0128 COMMON_PS8640_REGMAP_CONFIG,
0129 .max_register = 0xff,
0130 },
0131 [PAGE5_VPLL] = {
0132 COMMON_PS8640_REGMAP_CONFIG,
0133 .max_register = 0x7f,
0134 },
0135 [PAGE6_DSI_CNTL2] = {
0136 COMMON_PS8640_REGMAP_CONFIG,
0137 .max_register = 0xff,
0138 },
0139 [PAGE7_SPI_CNTL] = {
0140 COMMON_PS8640_REGMAP_CONFIG,
0141 .max_register = 0xff,
0142 },
0143 };
0144
0145 static inline struct ps8640 *bridge_to_ps8640(struct drm_bridge *e)
0146 {
0147 return container_of(e, struct ps8640, bridge);
0148 }
0149
0150 static inline struct ps8640 *aux_to_ps8640(struct drm_dp_aux *aux)
0151 {
0152 return container_of(aux, struct ps8640, aux);
0153 }
0154
0155 static bool ps8640_of_panel_on_aux_bus(struct device *dev)
0156 {
0157 struct device_node *bus, *panel;
0158
0159 bus = of_get_child_by_name(dev->of_node, "aux-bus");
0160 if (!bus)
0161 return false;
0162
0163 panel = of_get_child_by_name(bus, "panel");
0164 of_node_put(bus);
0165 if (!panel)
0166 return false;
0167 of_node_put(panel);
0168
0169 return true;
0170 }
0171
0172 static int _ps8640_wait_hpd_asserted(struct ps8640 *ps_bridge, unsigned long wait_us)
0173 {
0174 struct regmap *map = ps_bridge->regmap[PAGE2_TOP_CNTL];
0175 int status;
0176
0177
0178
0179
0180
0181
0182 return regmap_read_poll_timeout(map, PAGE2_GPIO_H, status,
0183 status & PS_GPIO9, wait_us / 10, wait_us);
0184 }
0185
0186 static int ps8640_wait_hpd_asserted(struct drm_dp_aux *aux, unsigned long wait_us)
0187 {
0188 struct ps8640 *ps_bridge = aux_to_ps8640(aux);
0189 struct device *dev = &ps_bridge->page[PAGE0_DP_CNTL]->dev;
0190 int ret;
0191
0192
0193
0194
0195
0196
0197 pm_runtime_get_sync(dev);
0198 ret = _ps8640_wait_hpd_asserted(ps_bridge, wait_us);
0199 pm_runtime_mark_last_busy(dev);
0200 pm_runtime_put_autosuspend(dev);
0201
0202 return ret;
0203 }
0204
0205 static ssize_t ps8640_aux_transfer_msg(struct drm_dp_aux *aux,
0206 struct drm_dp_aux_msg *msg)
0207 {
0208 struct ps8640 *ps_bridge = aux_to_ps8640(aux);
0209 struct regmap *map = ps_bridge->regmap[PAGE0_DP_CNTL];
0210 struct device *dev = &ps_bridge->page[PAGE0_DP_CNTL]->dev;
0211 unsigned int len = msg->size;
0212 unsigned int data;
0213 unsigned int base;
0214 int ret;
0215 u8 request = msg->request &
0216 ~(DP_AUX_I2C_MOT | DP_AUX_I2C_WRITE_STATUS_UPDATE);
0217 u8 *buf = msg->buffer;
0218 u8 addr_len[PAGE0_SWAUX_LENGTH + 1 - PAGE0_SWAUX_ADDR_7_0];
0219 u8 i;
0220 bool is_native_aux = false;
0221
0222 if (len > DP_AUX_MAX_PAYLOAD_BYTES)
0223 return -EINVAL;
0224
0225 if (msg->address & ~SWAUX_ADDR_MASK)
0226 return -EINVAL;
0227
0228 switch (request) {
0229 case DP_AUX_NATIVE_WRITE:
0230 case DP_AUX_NATIVE_READ:
0231 is_native_aux = true;
0232 fallthrough;
0233 case DP_AUX_I2C_WRITE:
0234 case DP_AUX_I2C_READ:
0235 break;
0236 default:
0237 return -EINVAL;
0238 }
0239
0240 ret = regmap_write(map, PAGE0_AUXCH_CFG3, AUXCH_CFG3_RESET);
0241 if (ret) {
0242 DRM_DEV_ERROR(dev, "failed to write PAGE0_AUXCH_CFG3: %d\n",
0243 ret);
0244 return ret;
0245 }
0246
0247
0248 msg->reply = 0;
0249
0250 base = PAGE0_SWAUX_ADDR_7_0;
0251 addr_len[PAGE0_SWAUX_ADDR_7_0 - base] = msg->address;
0252 addr_len[PAGE0_SWAUX_ADDR_15_8 - base] = msg->address >> 8;
0253 addr_len[PAGE0_SWAUX_ADDR_23_16 - base] = (msg->address >> 16) |
0254 (msg->request << 4);
0255 addr_len[PAGE0_SWAUX_LENGTH - base] = (len == 0) ? SWAUX_NO_PAYLOAD :
0256 ((len - 1) & SWAUX_LENGTH_MASK);
0257
0258 regmap_bulk_write(map, PAGE0_SWAUX_ADDR_7_0, addr_len,
0259 ARRAY_SIZE(addr_len));
0260
0261 if (len && (request == DP_AUX_NATIVE_WRITE ||
0262 request == DP_AUX_I2C_WRITE)) {
0263
0264 for (i = 0; i < len; i++) {
0265 ret = regmap_write(map, PAGE0_SWAUX_WDATA, buf[i]);
0266 if (ret) {
0267 DRM_DEV_ERROR(dev,
0268 "failed to write WDATA: %d\n",
0269 ret);
0270 return ret;
0271 }
0272 }
0273 }
0274
0275 regmap_write(map, PAGE0_SWAUX_CTRL, SWAUX_SEND);
0276
0277
0278 regmap_read_poll_timeout(map, PAGE0_SWAUX_CTRL, data,
0279 !(data & SWAUX_SEND), 0, 50 * 1000);
0280
0281 regmap_read(map, PAGE0_SWAUX_STATUS, &data);
0282 if (ret) {
0283 DRM_DEV_ERROR(dev, "failed to read PAGE0_SWAUX_STATUS: %d\n",
0284 ret);
0285 return ret;
0286 }
0287
0288 switch (data & SWAUX_STATUS_MASK) {
0289
0290 case SWAUX_STATUS_NACK:
0291 case SWAUX_STATUS_I2C_NACK:
0292
0293
0294
0295
0296
0297 if (is_native_aux)
0298 msg->reply |= DP_AUX_NATIVE_REPLY_NACK;
0299 else
0300 msg->reply |= DP_AUX_I2C_REPLY_NACK;
0301
0302 fallthrough;
0303 case SWAUX_STATUS_ACKM:
0304 len = data & SWAUX_M_MASK;
0305 break;
0306 case SWAUX_STATUS_INVALID:
0307 return -EOPNOTSUPP;
0308 case SWAUX_STATUS_TIMEOUT:
0309 return -ETIMEDOUT;
0310 }
0311
0312 if (len && (request == DP_AUX_NATIVE_READ ||
0313 request == DP_AUX_I2C_READ)) {
0314
0315 for (i = 0; i < len; i++) {
0316 ret = regmap_read(map, PAGE0_SWAUX_RDATA, &data);
0317 if (ret) {
0318 DRM_DEV_ERROR(dev,
0319 "failed to read RDATA: %d\n",
0320 ret);
0321 return ret;
0322 }
0323
0324 buf[i] = data;
0325 }
0326 }
0327
0328 return len;
0329 }
0330
0331 static ssize_t ps8640_aux_transfer(struct drm_dp_aux *aux,
0332 struct drm_dp_aux_msg *msg)
0333 {
0334 struct ps8640 *ps_bridge = aux_to_ps8640(aux);
0335 struct device *dev = &ps_bridge->page[PAGE0_DP_CNTL]->dev;
0336 int ret;
0337
0338 pm_runtime_get_sync(dev);
0339 ret = ps8640_aux_transfer_msg(aux, msg);
0340 pm_runtime_mark_last_busy(dev);
0341 pm_runtime_put_autosuspend(dev);
0342
0343 return ret;
0344 }
0345
0346 static void ps8640_bridge_vdo_control(struct ps8640 *ps_bridge,
0347 const enum ps8640_vdo_control ctrl)
0348 {
0349 struct regmap *map = ps_bridge->regmap[PAGE3_DSI_CNTL1];
0350 struct device *dev = &ps_bridge->page[PAGE3_DSI_CNTL1]->dev;
0351 u8 vdo_ctrl_buf[] = { VDO_CTL_ADD, ctrl };
0352 int ret;
0353
0354 ret = regmap_bulk_write(map, PAGE3_SET_ADD,
0355 vdo_ctrl_buf, sizeof(vdo_ctrl_buf));
0356
0357 if (ret < 0)
0358 dev_err(dev, "failed to %sable VDO: %d\n",
0359 ctrl == ENABLE ? "en" : "dis", ret);
0360 }
0361
0362 static int __maybe_unused ps8640_resume(struct device *dev)
0363 {
0364 struct ps8640 *ps_bridge = dev_get_drvdata(dev);
0365 int ret;
0366
0367 ret = regulator_bulk_enable(ARRAY_SIZE(ps_bridge->supplies),
0368 ps_bridge->supplies);
0369 if (ret < 0) {
0370 dev_err(dev, "cannot enable regulators %d\n", ret);
0371 return ret;
0372 }
0373
0374 gpiod_set_value(ps_bridge->gpio_powerdown, 0);
0375 gpiod_set_value(ps_bridge->gpio_reset, 1);
0376 usleep_range(2000, 2500);
0377 gpiod_set_value(ps_bridge->gpio_reset, 0);
0378
0379
0380
0381
0382
0383
0384
0385
0386 msleep(200);
0387
0388 return 0;
0389 }
0390
0391 static int __maybe_unused ps8640_suspend(struct device *dev)
0392 {
0393 struct ps8640 *ps_bridge = dev_get_drvdata(dev);
0394 int ret;
0395
0396 gpiod_set_value(ps_bridge->gpio_reset, 1);
0397 gpiod_set_value(ps_bridge->gpio_powerdown, 1);
0398 ret = regulator_bulk_disable(ARRAY_SIZE(ps_bridge->supplies),
0399 ps_bridge->supplies);
0400 if (ret < 0)
0401 dev_err(dev, "cannot disable regulators %d\n", ret);
0402
0403 return ret;
0404 }
0405
0406 static const struct dev_pm_ops ps8640_pm_ops = {
0407 SET_RUNTIME_PM_OPS(ps8640_suspend, ps8640_resume, NULL)
0408 SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
0409 pm_runtime_force_resume)
0410 };
0411
0412 static void ps8640_pre_enable(struct drm_bridge *bridge)
0413 {
0414 struct ps8640 *ps_bridge = bridge_to_ps8640(bridge);
0415 struct regmap *map = ps_bridge->regmap[PAGE2_TOP_CNTL];
0416 struct device *dev = &ps_bridge->page[PAGE0_DP_CNTL]->dev;
0417 int ret;
0418
0419 pm_runtime_get_sync(dev);
0420 ret = _ps8640_wait_hpd_asserted(ps_bridge, 200 * 1000);
0421 if (ret < 0)
0422 dev_warn(dev, "HPD didn't go high: %d\n", ret);
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432 ret = regmap_update_bits(map, PAGE2_MCS_EN, MCS_EN, 0);
0433 if (ret < 0)
0434 dev_warn(dev, "failed write PAGE2_MCS_EN: %d\n", ret);
0435
0436
0437 ret = regmap_write(map, PAGE2_I2C_BYPASS, I2C_BYPASS_EN);
0438 if (ret < 0)
0439 dev_warn(dev, "failed write PAGE2_MCS_EN: %d\n", ret);
0440
0441 ps8640_bridge_vdo_control(ps_bridge, ENABLE);
0442
0443 ps_bridge->pre_enabled = true;
0444 }
0445
0446 static void ps8640_post_disable(struct drm_bridge *bridge)
0447 {
0448 struct ps8640 *ps_bridge = bridge_to_ps8640(bridge);
0449
0450 ps_bridge->pre_enabled = false;
0451
0452 ps8640_bridge_vdo_control(ps_bridge, DISABLE);
0453 pm_runtime_put_sync_suspend(&ps_bridge->page[PAGE0_DP_CNTL]->dev);
0454 }
0455
0456 static int ps8640_bridge_attach(struct drm_bridge *bridge,
0457 enum drm_bridge_attach_flags flags)
0458 {
0459 struct ps8640 *ps_bridge = bridge_to_ps8640(bridge);
0460 struct device *dev = &ps_bridge->page[0]->dev;
0461 int ret;
0462
0463 if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR))
0464 return -EINVAL;
0465
0466 ps_bridge->aux.drm_dev = bridge->dev;
0467 ret = drm_dp_aux_register(&ps_bridge->aux);
0468 if (ret) {
0469 dev_err(dev, "failed to register DP AUX channel: %d\n", ret);
0470 return ret;
0471 }
0472
0473 ps_bridge->link = device_link_add(bridge->dev->dev, dev, DL_FLAG_STATELESS);
0474 if (!ps_bridge->link) {
0475 dev_err(dev, "failed to create device link");
0476 ret = -EINVAL;
0477 goto err_devlink;
0478 }
0479
0480
0481 ret = drm_bridge_attach(bridge->encoder, ps_bridge->panel_bridge,
0482 &ps_bridge->bridge, flags);
0483 if (ret)
0484 goto err_bridge_attach;
0485
0486 return 0;
0487
0488 err_bridge_attach:
0489 device_link_del(ps_bridge->link);
0490 err_devlink:
0491 drm_dp_aux_unregister(&ps_bridge->aux);
0492
0493 return ret;
0494 }
0495
0496 static void ps8640_bridge_detach(struct drm_bridge *bridge)
0497 {
0498 struct ps8640 *ps_bridge = bridge_to_ps8640(bridge);
0499
0500 drm_dp_aux_unregister(&ps_bridge->aux);
0501 if (ps_bridge->link)
0502 device_link_del(ps_bridge->link);
0503 }
0504
0505 static struct edid *ps8640_bridge_get_edid(struct drm_bridge *bridge,
0506 struct drm_connector *connector)
0507 {
0508 struct ps8640 *ps_bridge = bridge_to_ps8640(bridge);
0509 bool poweroff = !ps_bridge->pre_enabled;
0510 struct edid *edid;
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522
0523
0524 drm_bridge_chain_pre_enable(bridge);
0525
0526 edid = drm_get_edid(connector,
0527 ps_bridge->page[PAGE0_DP_CNTL]->adapter);
0528
0529
0530
0531
0532
0533 if (poweroff)
0534 drm_bridge_chain_post_disable(bridge);
0535
0536 return edid;
0537 }
0538
0539 static void ps8640_runtime_disable(void *data)
0540 {
0541 pm_runtime_dont_use_autosuspend(data);
0542 pm_runtime_disable(data);
0543 }
0544
0545 static const struct drm_bridge_funcs ps8640_bridge_funcs = {
0546 .attach = ps8640_bridge_attach,
0547 .detach = ps8640_bridge_detach,
0548 .get_edid = ps8640_bridge_get_edid,
0549 .post_disable = ps8640_post_disable,
0550 .pre_enable = ps8640_pre_enable,
0551 };
0552
0553 static int ps8640_bridge_get_dsi_resources(struct device *dev, struct ps8640 *ps_bridge)
0554 {
0555 struct device_node *in_ep, *dsi_node;
0556 struct mipi_dsi_device *dsi;
0557 struct mipi_dsi_host *host;
0558 const struct mipi_dsi_device_info info = { .type = "ps8640",
0559 .channel = 0,
0560 .node = NULL,
0561 };
0562
0563
0564 in_ep = of_graph_get_endpoint_by_regs(dev->of_node, 0, -1);
0565 if (!in_ep)
0566 return -ENODEV;
0567
0568 dsi_node = of_graph_get_remote_port_parent(in_ep);
0569 of_node_put(in_ep);
0570 if (!dsi_node)
0571 return -ENODEV;
0572
0573 host = of_find_mipi_dsi_host_by_node(dsi_node);
0574 of_node_put(dsi_node);
0575 if (!host)
0576 return -EPROBE_DEFER;
0577
0578 dsi = devm_mipi_dsi_device_register_full(dev, host, &info);
0579 if (IS_ERR(dsi)) {
0580 dev_err(dev, "failed to create dsi device\n");
0581 return PTR_ERR(dsi);
0582 }
0583
0584 ps_bridge->dsi = dsi;
0585
0586 dsi->host = host;
0587 dsi->mode_flags = MIPI_DSI_MODE_VIDEO |
0588 MIPI_DSI_MODE_VIDEO_SYNC_PULSE;
0589 dsi->format = MIPI_DSI_FMT_RGB888;
0590 dsi->lanes = NUM_MIPI_LANES;
0591
0592 return 0;
0593 }
0594
0595 static int ps8640_bridge_link_panel(struct drm_dp_aux *aux)
0596 {
0597 struct ps8640 *ps_bridge = aux_to_ps8640(aux);
0598 struct device *dev = aux->dev;
0599 struct device_node *np = dev->of_node;
0600 int ret;
0601
0602
0603
0604
0605
0606
0607
0608
0609
0610
0611
0612 ps_bridge->panel_bridge = devm_drm_of_get_bridge(dev, np, 1, 0);
0613 if (IS_ERR(ps_bridge->panel_bridge))
0614 return PTR_ERR(ps_bridge->panel_bridge);
0615
0616 ret = devm_drm_bridge_add(dev, &ps_bridge->bridge);
0617 if (ret)
0618 return ret;
0619
0620 return devm_mipi_dsi_attach(dev, ps_bridge->dsi);
0621 }
0622
0623 static int ps8640_probe(struct i2c_client *client)
0624 {
0625 struct device *dev = &client->dev;
0626 struct ps8640 *ps_bridge;
0627 int ret;
0628 u32 i;
0629
0630 ps_bridge = devm_kzalloc(dev, sizeof(*ps_bridge), GFP_KERNEL);
0631 if (!ps_bridge)
0632 return -ENOMEM;
0633
0634 ps_bridge->supplies[0].supply = "vdd33";
0635 ps_bridge->supplies[1].supply = "vdd12";
0636 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(ps_bridge->supplies),
0637 ps_bridge->supplies);
0638 if (ret)
0639 return ret;
0640
0641 ps_bridge->gpio_powerdown = devm_gpiod_get(&client->dev, "powerdown",
0642 GPIOD_OUT_HIGH);
0643 if (IS_ERR(ps_bridge->gpio_powerdown))
0644 return PTR_ERR(ps_bridge->gpio_powerdown);
0645
0646
0647
0648
0649 ps_bridge->gpio_reset = devm_gpiod_get(&client->dev, "reset",
0650 GPIOD_OUT_HIGH);
0651 if (IS_ERR(ps_bridge->gpio_reset))
0652 return PTR_ERR(ps_bridge->gpio_reset);
0653
0654 ps_bridge->bridge.funcs = &ps8640_bridge_funcs;
0655 ps_bridge->bridge.of_node = dev->of_node;
0656 ps_bridge->bridge.type = DRM_MODE_CONNECTOR_eDP;
0657
0658
0659
0660
0661
0662
0663 if (!ps8640_of_panel_on_aux_bus(&client->dev))
0664 ps_bridge->bridge.ops = DRM_BRIDGE_OP_EDID;
0665
0666
0667
0668
0669
0670 ret = ps8640_bridge_get_dsi_resources(&client->dev, ps_bridge);
0671 if (ret)
0672 return ret;
0673
0674 ps_bridge->page[PAGE0_DP_CNTL] = client;
0675
0676 ps_bridge->regmap[PAGE0_DP_CNTL] = devm_regmap_init_i2c(client, ps8640_regmap_config);
0677 if (IS_ERR(ps_bridge->regmap[PAGE0_DP_CNTL]))
0678 return PTR_ERR(ps_bridge->regmap[PAGE0_DP_CNTL]);
0679
0680 for (i = 1; i < ARRAY_SIZE(ps_bridge->page); i++) {
0681 ps_bridge->page[i] = devm_i2c_new_dummy_device(&client->dev,
0682 client->adapter,
0683 client->addr + i);
0684 if (IS_ERR(ps_bridge->page[i]))
0685 return PTR_ERR(ps_bridge->page[i]);
0686
0687 ps_bridge->regmap[i] = devm_regmap_init_i2c(ps_bridge->page[i],
0688 ps8640_regmap_config + i);
0689 if (IS_ERR(ps_bridge->regmap[i]))
0690 return PTR_ERR(ps_bridge->regmap[i]);
0691 }
0692
0693 i2c_set_clientdata(client, ps_bridge);
0694
0695 ps_bridge->aux.name = "parade-ps8640-aux";
0696 ps_bridge->aux.dev = dev;
0697 ps_bridge->aux.transfer = ps8640_aux_transfer;
0698 ps_bridge->aux.wait_hpd_asserted = ps8640_wait_hpd_asserted;
0699 drm_dp_aux_init(&ps_bridge->aux);
0700
0701 pm_runtime_enable(dev);
0702
0703
0704
0705
0706
0707
0708
0709
0710 pm_runtime_set_autosuspend_delay(dev, 1000);
0711 pm_runtime_use_autosuspend(dev);
0712 pm_suspend_ignore_children(dev, true);
0713 ret = devm_add_action_or_reset(dev, ps8640_runtime_disable, dev);
0714 if (ret)
0715 return ret;
0716
0717 ret = devm_of_dp_aux_populate_bus(&ps_bridge->aux, ps8640_bridge_link_panel);
0718
0719
0720
0721
0722
0723
0724 if (ret == -ENODEV)
0725 return ps8640_bridge_link_panel(&ps_bridge->aux);
0726
0727 return ret;
0728 }
0729
0730 static const struct of_device_id ps8640_match[] = {
0731 { .compatible = "parade,ps8640" },
0732 { }
0733 };
0734 MODULE_DEVICE_TABLE(of, ps8640_match);
0735
0736 static struct i2c_driver ps8640_driver = {
0737 .probe_new = ps8640_probe,
0738 .driver = {
0739 .name = "ps8640",
0740 .of_match_table = ps8640_match,
0741 .pm = &ps8640_pm_ops,
0742 },
0743 };
0744 module_i2c_driver(ps8640_driver);
0745
0746 MODULE_AUTHOR("Jitao Shi <jitao.shi@mediatek.com>");
0747 MODULE_AUTHOR("CK Hu <ck.hu@mediatek.com>");
0748 MODULE_AUTHOR("Enric Balletbo i Serra <enric.balletbo@collabora.com>");
0749 MODULE_DESCRIPTION("PARADE ps8640 DSI-eDP converter driver");
0750 MODULE_LICENSE("GPL v2");