Path: blob/master/drivers/gpu/drm/bridge/parade-ps8640.c
26494 views
// SPDX-License-Identifier: GPL-2.0-only1/*2* Copyright (c) 2016 MediaTek Inc.3*/45#include <linux/delay.h>6#include <linux/err.h>7#include <linux/gpio/consumer.h>8#include <linux/i2c.h>9#include <linux/module.h>10#include <linux/of_graph.h>11#include <linux/pm_runtime.h>12#include <linux/regmap.h>13#include <linux/regulator/consumer.h>1415#include <drm/display/drm_dp_aux_bus.h>16#include <drm/display/drm_dp_helper.h>17#include <drm/drm_atomic_state_helper.h>18#include <drm/drm_bridge.h>19#include <drm/drm_edid.h>20#include <drm/drm_mipi_dsi.h>21#include <drm/drm_of.h>22#include <drm/drm_print.h>2324#define PAGE0_AUXCH_CFG3 0x7625#define AUXCH_CFG3_RESET 0xff26#define PAGE0_SWAUX_ADDR_7_0 0x7d27#define PAGE0_SWAUX_ADDR_15_8 0x7e28#define PAGE0_SWAUX_ADDR_23_16 0x7f29#define SWAUX_ADDR_MASK GENMASK(19, 0)30#define PAGE0_SWAUX_LENGTH 0x8031#define SWAUX_LENGTH_MASK GENMASK(3, 0)32#define SWAUX_NO_PAYLOAD BIT(7)33#define PAGE0_SWAUX_WDATA 0x8134#define PAGE0_SWAUX_RDATA 0x8235#define PAGE0_SWAUX_CTRL 0x8336#define SWAUX_SEND BIT(0)37#define PAGE0_SWAUX_STATUS 0x8438#define SWAUX_M_MASK GENMASK(4, 0)39#define SWAUX_STATUS_MASK GENMASK(7, 5)40#define SWAUX_STATUS_NACK (0x1 << 5)41#define SWAUX_STATUS_DEFER (0x2 << 5)42#define SWAUX_STATUS_ACKM (0x3 << 5)43#define SWAUX_STATUS_INVALID (0x4 << 5)44#define SWAUX_STATUS_I2C_NACK (0x5 << 5)45#define SWAUX_STATUS_I2C_DEFER (0x6 << 5)46#define SWAUX_STATUS_TIMEOUT (0x7 << 5)4748#define PAGE2_GPIO_H 0xa749#define PS_GPIO9 BIT(1)50#define PAGE2_I2C_BYPASS 0xea51#define I2C_BYPASS_EN 0xd052#define PAGE2_MCS_EN 0xf353#define MCS_EN BIT(0)5455#define PAGE3_SET_ADD 0xfe56#define VDO_CTL_ADD 0x1357#define VDO_DIS 0x1858#define VDO_EN 0x1c5960#define NUM_MIPI_LANES 46162#define COMMON_PS8640_REGMAP_CONFIG \63.reg_bits = 8, \64.val_bits = 8, \65.cache_type = REGCACHE_NONE6667/*68* PS8640 uses multiple addresses:69* page[0]: for DP control70* page[1]: for VIDEO Bridge71* page[2]: for control top72* page[3]: for DSI Link Control173* page[4]: for MIPI Phy74* page[5]: for VPLL75* page[6]: for DSI Link Control276* page[7]: for SPI ROM mapping77*/78enum page_addr_offset {79PAGE0_DP_CNTL = 0,80PAGE1_VDO_BDG,81PAGE2_TOP_CNTL,82PAGE3_DSI_CNTL1,83PAGE4_MIPI_PHY,84PAGE5_VPLL,85PAGE6_DSI_CNTL2,86PAGE7_SPI_CNTL,87MAX_DEVS88};8990enum ps8640_vdo_control {91DISABLE = VDO_DIS,92ENABLE = VDO_EN,93};9495struct ps8640 {96struct drm_bridge bridge;97struct drm_bridge *panel_bridge;98struct drm_dp_aux aux;99struct mipi_dsi_device *dsi;100struct i2c_client *page[MAX_DEVS];101struct regmap *regmap[MAX_DEVS];102struct regulator_bulk_data supplies[2];103struct gpio_desc *gpio_reset;104struct gpio_desc *gpio_powerdown;105struct device_link *link;106bool pre_enabled;107bool need_post_hpd_delay;108struct mutex aux_lock;109};110111static const struct regmap_config ps8640_regmap_config[] = {112[PAGE0_DP_CNTL] = {113COMMON_PS8640_REGMAP_CONFIG,114.max_register = 0xbf,115},116[PAGE1_VDO_BDG] = {117COMMON_PS8640_REGMAP_CONFIG,118.max_register = 0xff,119},120[PAGE2_TOP_CNTL] = {121COMMON_PS8640_REGMAP_CONFIG,122.max_register = 0xff,123},124[PAGE3_DSI_CNTL1] = {125COMMON_PS8640_REGMAP_CONFIG,126.max_register = 0xff,127},128[PAGE4_MIPI_PHY] = {129COMMON_PS8640_REGMAP_CONFIG,130.max_register = 0xff,131},132[PAGE5_VPLL] = {133COMMON_PS8640_REGMAP_CONFIG,134.max_register = 0x7f,135},136[PAGE6_DSI_CNTL2] = {137COMMON_PS8640_REGMAP_CONFIG,138.max_register = 0xff,139},140[PAGE7_SPI_CNTL] = {141COMMON_PS8640_REGMAP_CONFIG,142.max_register = 0xff,143},144};145146static inline struct ps8640 *bridge_to_ps8640(struct drm_bridge *e)147{148return container_of(e, struct ps8640, bridge);149}150151static inline struct ps8640 *aux_to_ps8640(struct drm_dp_aux *aux)152{153return container_of(aux, struct ps8640, aux);154}155156static int _ps8640_wait_hpd_asserted(struct ps8640 *ps_bridge, unsigned long wait_us)157{158struct regmap *map = ps_bridge->regmap[PAGE2_TOP_CNTL];159int status;160int ret;161162/*163* Apparently something about the firmware in the chip signals that164* HPD goes high by reporting GPIO9 as high (even though HPD isn't165* actually connected to GPIO9).166*/167ret = regmap_read_poll_timeout(map, PAGE2_GPIO_H, status,168status & PS_GPIO9, 20000, wait_us);169170/*171* The first time we see HPD go high after a reset we delay an extra172* 50 ms. The best guess is that the MCU is doing "stuff" during this173* time (maybe talking to the panel) and we don't want to interrupt it.174*175* No locking is done around "need_post_hpd_delay". If we're here we176* know we're holding a PM Runtime reference and the only other place177* that touches this is PM Runtime resume.178*/179if (!ret && ps_bridge->need_post_hpd_delay) {180ps_bridge->need_post_hpd_delay = false;181msleep(50);182}183184return ret;185}186187static int ps8640_wait_hpd_asserted(struct drm_dp_aux *aux, unsigned long wait_us)188{189struct ps8640 *ps_bridge = aux_to_ps8640(aux);190struct device *dev = &ps_bridge->page[PAGE0_DP_CNTL]->dev;191int ret;192193/*194* Note that this function is called by code that has already powered195* the panel. We have to power ourselves up but we don't need to worry196* about powering the panel.197*/198pm_runtime_get_sync(dev);199ret = _ps8640_wait_hpd_asserted(ps_bridge, wait_us);200pm_runtime_mark_last_busy(dev);201pm_runtime_put_autosuspend(dev);202203return ret;204}205206static ssize_t ps8640_aux_transfer_msg(struct drm_dp_aux *aux,207struct drm_dp_aux_msg *msg)208{209struct ps8640 *ps_bridge = aux_to_ps8640(aux);210struct regmap *map = ps_bridge->regmap[PAGE0_DP_CNTL];211struct device *dev = &ps_bridge->page[PAGE0_DP_CNTL]->dev;212size_t len = msg->size;213unsigned int data;214unsigned int base;215int ret;216u8 request = msg->request &217~(DP_AUX_I2C_MOT | DP_AUX_I2C_WRITE_STATUS_UPDATE);218u8 *buf = msg->buffer;219u8 addr_len[PAGE0_SWAUX_LENGTH + 1 - PAGE0_SWAUX_ADDR_7_0];220u8 i;221bool is_native_aux = false;222223if (len > DP_AUX_MAX_PAYLOAD_BYTES)224return -EINVAL;225226if (msg->address & ~SWAUX_ADDR_MASK)227return -EINVAL;228229switch (request) {230case DP_AUX_NATIVE_WRITE:231case DP_AUX_NATIVE_READ:232is_native_aux = true;233fallthrough;234case DP_AUX_I2C_WRITE:235case DP_AUX_I2C_READ:236break;237default:238return -EINVAL;239}240241ret = regmap_write(map, PAGE0_AUXCH_CFG3, AUXCH_CFG3_RESET);242if (ret) {243DRM_DEV_ERROR(dev, "failed to write PAGE0_AUXCH_CFG3: %d\n",244ret);245return ret;246}247248/* Assume it's good */249msg->reply = 0;250251base = PAGE0_SWAUX_ADDR_7_0;252addr_len[PAGE0_SWAUX_ADDR_7_0 - base] = msg->address;253addr_len[PAGE0_SWAUX_ADDR_15_8 - base] = msg->address >> 8;254addr_len[PAGE0_SWAUX_ADDR_23_16 - base] = (msg->address >> 16) |255(msg->request << 4);256addr_len[PAGE0_SWAUX_LENGTH - base] = (len == 0) ? SWAUX_NO_PAYLOAD :257((len - 1) & SWAUX_LENGTH_MASK);258259regmap_bulk_write(map, PAGE0_SWAUX_ADDR_7_0, addr_len,260ARRAY_SIZE(addr_len));261262if (len && (request == DP_AUX_NATIVE_WRITE ||263request == DP_AUX_I2C_WRITE)) {264/* Write to the internal FIFO buffer */265for (i = 0; i < len; i++) {266ret = regmap_write(map, PAGE0_SWAUX_WDATA, buf[i]);267if (ret) {268DRM_DEV_ERROR(dev,269"failed to write WDATA: %d\n",270ret);271return ret;272}273}274}275276regmap_write(map, PAGE0_SWAUX_CTRL, SWAUX_SEND);277278/* Zero delay loop because i2c transactions are slow already */279regmap_read_poll_timeout(map, PAGE0_SWAUX_CTRL, data,280!(data & SWAUX_SEND), 0, 50 * 1000);281282regmap_read(map, PAGE0_SWAUX_STATUS, &data);283if (ret) {284DRM_DEV_ERROR(dev, "failed to read PAGE0_SWAUX_STATUS: %d\n",285ret);286return ret;287}288289switch (data & SWAUX_STATUS_MASK) {290case SWAUX_STATUS_NACK:291case SWAUX_STATUS_I2C_NACK:292/*293* The programming guide is not clear about whether a I2C NACK294* would trigger SWAUX_STATUS_NACK or SWAUX_STATUS_I2C_NACK. So295* we handle both cases together.296*/297if (is_native_aux)298msg->reply |= DP_AUX_NATIVE_REPLY_NACK;299else300msg->reply |= DP_AUX_I2C_REPLY_NACK;301302fallthrough;303case SWAUX_STATUS_ACKM:304len = data & SWAUX_M_MASK;305break;306case SWAUX_STATUS_DEFER:307case SWAUX_STATUS_I2C_DEFER:308if (is_native_aux)309msg->reply |= DP_AUX_NATIVE_REPLY_DEFER;310else311msg->reply |= DP_AUX_I2C_REPLY_DEFER;312len = data & SWAUX_M_MASK;313break;314case SWAUX_STATUS_INVALID:315return -EOPNOTSUPP;316case SWAUX_STATUS_TIMEOUT:317return -ETIMEDOUT;318}319320if (len && (request == DP_AUX_NATIVE_READ ||321request == DP_AUX_I2C_READ)) {322/* Read from the internal FIFO buffer */323for (i = 0; i < len; i++) {324ret = regmap_read(map, PAGE0_SWAUX_RDATA, &data);325if (ret) {326DRM_DEV_ERROR(dev,327"failed to read RDATA: %d\n",328ret);329return ret;330}331332if (i < msg->size)333buf[i] = data;334}335}336337return min(len, msg->size);338}339340static ssize_t ps8640_aux_transfer(struct drm_dp_aux *aux,341struct drm_dp_aux_msg *msg)342{343struct ps8640 *ps_bridge = aux_to_ps8640(aux);344struct device *dev = &ps_bridge->page[PAGE0_DP_CNTL]->dev;345int ret;346347mutex_lock(&ps_bridge->aux_lock);348pm_runtime_get_sync(dev);349ret = _ps8640_wait_hpd_asserted(ps_bridge, 200 * 1000);350if (ret) {351pm_runtime_put_sync_suspend(dev);352goto exit;353}354ret = ps8640_aux_transfer_msg(aux, msg);355pm_runtime_mark_last_busy(dev);356pm_runtime_put_autosuspend(dev);357358exit:359mutex_unlock(&ps_bridge->aux_lock);360361return ret;362}363364static void ps8640_bridge_vdo_control(struct ps8640 *ps_bridge,365const enum ps8640_vdo_control ctrl)366{367struct regmap *map = ps_bridge->regmap[PAGE3_DSI_CNTL1];368struct device *dev = &ps_bridge->page[PAGE3_DSI_CNTL1]->dev;369u8 vdo_ctrl_buf[] = { VDO_CTL_ADD, ctrl };370int ret;371372ret = regmap_bulk_write(map, PAGE3_SET_ADD,373vdo_ctrl_buf, sizeof(vdo_ctrl_buf));374375if (ret < 0)376dev_err(dev, "failed to %sable VDO: %d\n",377ctrl == ENABLE ? "en" : "dis", ret);378}379380static int __maybe_unused ps8640_resume(struct device *dev)381{382struct ps8640 *ps_bridge = dev_get_drvdata(dev);383int ret;384385ret = regulator_bulk_enable(ARRAY_SIZE(ps_bridge->supplies),386ps_bridge->supplies);387if (ret < 0) {388dev_err(dev, "cannot enable regulators %d\n", ret);389return ret;390}391392gpiod_set_value(ps_bridge->gpio_powerdown, 0);393gpiod_set_value(ps_bridge->gpio_reset, 1);394usleep_range(2000, 2500);395gpiod_set_value(ps_bridge->gpio_reset, 0);396/* Double reset for T4 and T5 */397msleep(50);398gpiod_set_value(ps_bridge->gpio_reset, 1);399msleep(50);400gpiod_set_value(ps_bridge->gpio_reset, 0);401402/* We just reset things, so we need a delay after the first HPD */403ps_bridge->need_post_hpd_delay = true;404405/*406* Mystery 200 ms delay for the "MCU to be ready". It's unclear if407* this is truly necessary since the MCU will already signal that408* things are "good to go" by signaling HPD on "gpio 9". See409* _ps8640_wait_hpd_asserted(). For now we'll keep this mystery delay410* just in case.411*/412msleep(200);413414return 0;415}416417static int __maybe_unused ps8640_suspend(struct device *dev)418{419struct ps8640 *ps_bridge = dev_get_drvdata(dev);420int ret;421422gpiod_set_value(ps_bridge->gpio_reset, 1);423gpiod_set_value(ps_bridge->gpio_powerdown, 1);424ret = regulator_bulk_disable(ARRAY_SIZE(ps_bridge->supplies),425ps_bridge->supplies);426if (ret < 0)427dev_err(dev, "cannot disable regulators %d\n", ret);428429return ret;430}431432static const struct dev_pm_ops ps8640_pm_ops = {433SET_RUNTIME_PM_OPS(ps8640_suspend, ps8640_resume, NULL)434SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,435pm_runtime_force_resume)436};437438static void ps8640_atomic_pre_enable(struct drm_bridge *bridge,439struct drm_atomic_state *state)440{441struct ps8640 *ps_bridge = bridge_to_ps8640(bridge);442struct regmap *map = ps_bridge->regmap[PAGE2_TOP_CNTL];443struct device *dev = &ps_bridge->page[PAGE0_DP_CNTL]->dev;444int ret;445446pm_runtime_get_sync(dev);447ret = _ps8640_wait_hpd_asserted(ps_bridge, 200 * 1000);448if (ret < 0)449dev_warn(dev, "HPD didn't go high: %d\n", ret);450451/*452* The Manufacturer Command Set (MCS) is a device dependent interface453* intended for factory programming of the display module default454* parameters. Once the display module is configured, the MCS shall be455* disabled by the manufacturer. Once disabled, all MCS commands are456* ignored by the display interface.457*/458459ret = regmap_update_bits(map, PAGE2_MCS_EN, MCS_EN, 0);460if (ret < 0)461dev_warn(dev, "failed write PAGE2_MCS_EN: %d\n", ret);462463/* Switch access edp panel's edid through i2c */464ret = regmap_write(map, PAGE2_I2C_BYPASS, I2C_BYPASS_EN);465if (ret < 0)466dev_warn(dev, "failed write PAGE2_MCS_EN: %d\n", ret);467468ps8640_bridge_vdo_control(ps_bridge, ENABLE);469470ps_bridge->pre_enabled = true;471}472473static void ps8640_atomic_post_disable(struct drm_bridge *bridge,474struct drm_atomic_state *state)475{476struct ps8640 *ps_bridge = bridge_to_ps8640(bridge);477478ps_bridge->pre_enabled = false;479480ps8640_bridge_vdo_control(ps_bridge, DISABLE);481482/*483* The bridge seems to expect everything to be power cycled at the484* disable process, so grab a lock here to make sure485* ps8640_aux_transfer() is not holding a runtime PM reference and486* preventing the bridge from suspend.487*/488mutex_lock(&ps_bridge->aux_lock);489490pm_runtime_put_sync_suspend(&ps_bridge->page[PAGE0_DP_CNTL]->dev);491492mutex_unlock(&ps_bridge->aux_lock);493}494495static int ps8640_bridge_attach(struct drm_bridge *bridge,496struct drm_encoder *encoder,497enum drm_bridge_attach_flags flags)498{499struct ps8640 *ps_bridge = bridge_to_ps8640(bridge);500struct device *dev = &ps_bridge->page[0]->dev;501int ret;502503if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR))504return -EINVAL;505506ps_bridge->aux.drm_dev = bridge->dev;507ret = drm_dp_aux_register(&ps_bridge->aux);508if (ret) {509dev_err(dev, "failed to register DP AUX channel: %d\n", ret);510return ret;511}512513ps_bridge->link = device_link_add(bridge->dev->dev, dev, DL_FLAG_STATELESS);514if (!ps_bridge->link) {515dev_err(dev, "failed to create device link");516ret = -EINVAL;517goto err_devlink;518}519520/* Attach the panel-bridge to the dsi bridge */521ret = drm_bridge_attach(encoder, ps_bridge->panel_bridge,522&ps_bridge->bridge, flags);523if (ret)524goto err_bridge_attach;525526return 0;527528err_bridge_attach:529device_link_del(ps_bridge->link);530err_devlink:531drm_dp_aux_unregister(&ps_bridge->aux);532533return ret;534}535536static void ps8640_bridge_detach(struct drm_bridge *bridge)537{538struct ps8640 *ps_bridge = bridge_to_ps8640(bridge);539540drm_dp_aux_unregister(&ps_bridge->aux);541if (ps_bridge->link)542device_link_del(ps_bridge->link);543}544545static void ps8640_runtime_disable(void *data)546{547pm_runtime_dont_use_autosuspend(data);548pm_runtime_disable(data);549}550551static const struct drm_bridge_funcs ps8640_bridge_funcs = {552.attach = ps8640_bridge_attach,553.detach = ps8640_bridge_detach,554.atomic_post_disable = ps8640_atomic_post_disable,555.atomic_pre_enable = ps8640_atomic_pre_enable,556.atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,557.atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,558.atomic_reset = drm_atomic_helper_bridge_reset,559};560561static int ps8640_bridge_get_dsi_resources(struct device *dev, struct ps8640 *ps_bridge)562{563struct device_node *in_ep, *dsi_node;564struct mipi_dsi_device *dsi;565struct mipi_dsi_host *host;566const struct mipi_dsi_device_info info = { .type = "ps8640",567.channel = 0,568.node = NULL,569};570571/* port@0 is ps8640 dsi input port */572in_ep = of_graph_get_endpoint_by_regs(dev->of_node, 0, -1);573if (!in_ep)574return -ENODEV;575576dsi_node = of_graph_get_remote_port_parent(in_ep);577of_node_put(in_ep);578if (!dsi_node)579return -ENODEV;580581host = of_find_mipi_dsi_host_by_node(dsi_node);582of_node_put(dsi_node);583if (!host)584return -EPROBE_DEFER;585586dsi = devm_mipi_dsi_device_register_full(dev, host, &info);587if (IS_ERR(dsi)) {588dev_err(dev, "failed to create dsi device\n");589return PTR_ERR(dsi);590}591592ps_bridge->dsi = dsi;593594dsi->host = host;595dsi->mode_flags = MIPI_DSI_MODE_VIDEO |596MIPI_DSI_MODE_VIDEO_SYNC_PULSE;597dsi->format = MIPI_DSI_FMT_RGB888;598dsi->lanes = NUM_MIPI_LANES;599600return 0;601}602603static int ps8640_bridge_link_panel(struct drm_dp_aux *aux)604{605struct ps8640 *ps_bridge = aux_to_ps8640(aux);606struct device *dev = aux->dev;607struct device_node *np = dev->of_node;608int ret;609610/*611* NOTE about returning -EPROBE_DEFER from this function: if we612* return an error (most relevant to -EPROBE_DEFER) it will only613* be passed out to ps8640_probe() if it called this directly (AKA the614* panel isn't under the "aux-bus" node). That should be fine because615* if the panel is under "aux-bus" it's guaranteed to have probed by616* the time this function has been called.617*/618619/* port@1 is ps8640 output port */620ps_bridge->panel_bridge = devm_drm_of_get_bridge(dev, np, 1, 0);621if (IS_ERR(ps_bridge->panel_bridge))622return PTR_ERR(ps_bridge->panel_bridge);623624ret = devm_drm_bridge_add(dev, &ps_bridge->bridge);625if (ret)626return ret;627628return devm_mipi_dsi_attach(dev, ps_bridge->dsi);629}630631static int ps8640_probe(struct i2c_client *client)632{633struct device *dev = &client->dev;634struct ps8640 *ps_bridge;635int ret;636u32 i;637638ps_bridge = devm_drm_bridge_alloc(dev, struct ps8640, bridge,639&ps8640_bridge_funcs);640if (IS_ERR(ps_bridge))641return PTR_ERR(ps_bridge);642643mutex_init(&ps_bridge->aux_lock);644645ps_bridge->supplies[0].supply = "vdd12";646ps_bridge->supplies[1].supply = "vdd33";647ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(ps_bridge->supplies),648ps_bridge->supplies);649if (ret)650return ret;651652ps_bridge->gpio_powerdown = devm_gpiod_get(&client->dev, "powerdown",653GPIOD_OUT_HIGH);654if (IS_ERR(ps_bridge->gpio_powerdown))655return PTR_ERR(ps_bridge->gpio_powerdown);656657/*658* Assert the reset to avoid the bridge being initialized prematurely659*/660ps_bridge->gpio_reset = devm_gpiod_get(&client->dev, "reset",661GPIOD_OUT_HIGH);662if (IS_ERR(ps_bridge->gpio_reset))663return PTR_ERR(ps_bridge->gpio_reset);664665ps_bridge->bridge.of_node = dev->of_node;666ps_bridge->bridge.type = DRM_MODE_CONNECTOR_eDP;667668/*669* Get MIPI DSI resources early. These can return -EPROBE_DEFER so670* we want to get them out of the way sooner.671*/672ret = ps8640_bridge_get_dsi_resources(&client->dev, ps_bridge);673if (ret)674return ret;675676ps_bridge->page[PAGE0_DP_CNTL] = client;677678ps_bridge->regmap[PAGE0_DP_CNTL] = devm_regmap_init_i2c(client, ps8640_regmap_config);679if (IS_ERR(ps_bridge->regmap[PAGE0_DP_CNTL]))680return PTR_ERR(ps_bridge->regmap[PAGE0_DP_CNTL]);681682for (i = 1; i < ARRAY_SIZE(ps_bridge->page); i++) {683ps_bridge->page[i] = devm_i2c_new_dummy_device(&client->dev,684client->adapter,685client->addr + i);686if (IS_ERR(ps_bridge->page[i]))687return PTR_ERR(ps_bridge->page[i]);688689ps_bridge->regmap[i] = devm_regmap_init_i2c(ps_bridge->page[i],690ps8640_regmap_config + i);691if (IS_ERR(ps_bridge->regmap[i]))692return PTR_ERR(ps_bridge->regmap[i]);693}694695i2c_set_clientdata(client, ps_bridge);696697ps_bridge->aux.name = "parade-ps8640-aux";698ps_bridge->aux.dev = dev;699ps_bridge->aux.transfer = ps8640_aux_transfer;700ps_bridge->aux.wait_hpd_asserted = ps8640_wait_hpd_asserted;701drm_dp_aux_init(&ps_bridge->aux);702703pm_runtime_enable(dev);704/*705* Powering on ps8640 takes ~300ms. To avoid wasting time on power706* cycling ps8640 too often, set autosuspend_delay to 2000ms to ensure707* the bridge wouldn't suspend in between each _aux_transfer_msg() call708* during EDID read (~20ms in my experiment) and in between the last709* _aux_transfer_msg() call during EDID read and the _pre_enable() call710* (~100ms in my experiment).711*/712pm_runtime_set_autosuspend_delay(dev, 2000);713pm_runtime_use_autosuspend(dev);714pm_suspend_ignore_children(dev, true);715ret = devm_add_action_or_reset(dev, ps8640_runtime_disable, dev);716if (ret)717return ret;718719ret = devm_of_dp_aux_populate_bus(&ps_bridge->aux, ps8640_bridge_link_panel);720721/*722* If devm_of_dp_aux_populate_bus() returns -ENODEV then it's up to723* usa to call ps8640_bridge_link_panel() directly. NOTE: in this case724* the function is allowed to -EPROBE_DEFER.725*/726if (ret == -ENODEV)727return ps8640_bridge_link_panel(&ps_bridge->aux);728729return ret;730}731732static const struct of_device_id ps8640_match[] = {733{ .compatible = "parade,ps8640" },734{ }735};736MODULE_DEVICE_TABLE(of, ps8640_match);737738static struct i2c_driver ps8640_driver = {739.probe = ps8640_probe,740.driver = {741.name = "ps8640",742.of_match_table = ps8640_match,743.pm = &ps8640_pm_ops,744},745};746module_i2c_driver(ps8640_driver);747748MODULE_AUTHOR("Jitao Shi <[email protected]>");749MODULE_AUTHOR("CK Hu <[email protected]>");750MODULE_AUTHOR("Enric Balletbo i Serra <[email protected]>");751MODULE_DESCRIPTION("PARADE ps8640 DSI-eDP converter driver");752MODULE_LICENSE("GPL v2");753754755