Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.9.
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright (c) 2018, The Linux Foundation. All rights reserved.
   4 * Copyright (c) 2019-2020. Linaro Limited.
   5 */
   6
   7#include <linux/firmware.h>
   8#include <linux/gpio/consumer.h>
   9#include <linux/i2c.h>
  10#include <linux/interrupt.h>
  11#include <linux/module.h>
  12#include <linux/mutex.h>
  13#include <linux/of_graph.h>
  14#include <linux/platform_device.h>
  15#include <linux/regmap.h>
  16#include <linux/regulator/consumer.h>
  17#include <linux/wait.h>
  18#include <linux/workqueue.h>
  19
  20#include <sound/hdmi-codec.h>
  21
  22#include <drm/drm_atomic_helper.h>
  23#include <drm/drm_bridge.h>
  24#include <drm/drm_edid.h>
  25#include <drm/drm_mipi_dsi.h>
  26#include <drm/drm_print.h>
  27#include <drm/drm_probe_helper.h>
  28
  29#define EDID_BLOCK_SIZE	128
  30#define EDID_NUM_BLOCKS	2
  31
  32#define FW_FILE "lt9611uxc_fw.bin"
  33
  34struct lt9611uxc {
  35	struct device *dev;
  36	struct drm_bridge bridge;
  37	struct drm_connector connector;
  38
  39	struct regmap *regmap;
  40	/* Protects all accesses to registers by stopping the on-chip MCU */
  41	struct mutex ocm_lock;
  42
  43	struct wait_queue_head wq;
  44	struct work_struct work;
  45
  46	struct device_node *dsi0_node;
  47	struct device_node *dsi1_node;
  48	struct mipi_dsi_device *dsi0;
  49	struct mipi_dsi_device *dsi1;
  50	struct platform_device *audio_pdev;
  51
  52	struct gpio_desc *reset_gpio;
  53	struct gpio_desc *enable_gpio;
  54
  55	struct regulator_bulk_data supplies[2];
  56
  57	struct i2c_client *client;
  58
  59	bool hpd_supported;
  60	bool edid_read;
  61	/* can be accessed from different threads, so protect this with ocm_lock */
  62	bool hdmi_connected;
  63	uint8_t fw_version;
  64};
  65
  66#define LT9611_PAGE_CONTROL	0xff
  67
  68static const struct regmap_range_cfg lt9611uxc_ranges[] = {
  69	{
  70		.name = "register_range",
  71		.range_min =  0,
  72		.range_max = 0xd0ff,
  73		.selector_reg = LT9611_PAGE_CONTROL,
  74		.selector_mask = 0xff,
  75		.selector_shift = 0,
  76		.window_start = 0,
  77		.window_len = 0x100,
  78	},
  79};
  80
  81static const struct regmap_config lt9611uxc_regmap_config = {
  82	.reg_bits = 8,
  83	.val_bits = 8,
  84	.max_register = 0xffff,
  85	.ranges = lt9611uxc_ranges,
  86	.num_ranges = ARRAY_SIZE(lt9611uxc_ranges),
  87};
  88
  89struct lt9611uxc_mode {
  90	u16 hdisplay;
  91	u16 vdisplay;
  92	u8 vrefresh;
  93};
  94
  95/*
  96 * This chip supports only a fixed set of modes.
  97 * Enumerate them here to check whether the mode is supported.
  98 */
  99static struct lt9611uxc_mode lt9611uxc_modes[] = {
 100	{ 1920, 1080, 60 },
 101	{ 1920, 1080, 30 },
 102	{ 1920, 1080, 25 },
 103	{ 1366, 768, 60 },
 104	{ 1360, 768, 60 },
 105	{ 1280, 1024, 60 },
 106	{ 1280, 800, 60 },
 107	{ 1280, 720, 60 },
 108	{ 1280, 720, 50 },
 109	{ 1280, 720, 30 },
 110	{ 1152, 864, 60 },
 111	{ 1024, 768, 60 },
 112	{ 800, 600, 60 },
 113	{ 720, 576, 50 },
 114	{ 720, 480, 60 },
 115	{ 640, 480, 60 },
 116};
 117
 118static struct lt9611uxc *bridge_to_lt9611uxc(struct drm_bridge *bridge)
 119{
 120	return container_of(bridge, struct lt9611uxc, bridge);
 121}
 122
 123static struct lt9611uxc *connector_to_lt9611uxc(struct drm_connector *connector)
 124{
 125	return container_of(connector, struct lt9611uxc, connector);
 126}
 127
 128static void lt9611uxc_lock(struct lt9611uxc *lt9611uxc)
 129{
 130	mutex_lock(&lt9611uxc->ocm_lock);
 131	regmap_write(lt9611uxc->regmap, 0x80ee, 0x01);
 132}
 133
 134static void lt9611uxc_unlock(struct lt9611uxc *lt9611uxc)
 135{
 136	regmap_write(lt9611uxc->regmap, 0x80ee, 0x00);
 137	msleep(50);
 138	mutex_unlock(&lt9611uxc->ocm_lock);
 139}
 140
 141static irqreturn_t lt9611uxc_irq_thread_handler(int irq, void *dev_id)
 142{
 143	struct lt9611uxc *lt9611uxc = dev_id;
 144	unsigned int irq_status = 0;
 145	unsigned int hpd_status = 0;
 146
 147	lt9611uxc_lock(lt9611uxc);
 148
 149	regmap_read(lt9611uxc->regmap, 0xb022, &irq_status);
 150	regmap_read(lt9611uxc->regmap, 0xb023, &hpd_status);
 151	if (irq_status)
 152		regmap_write(lt9611uxc->regmap, 0xb022, 0);
 153
 154	if (irq_status & BIT(0)) {
 155		lt9611uxc->edid_read = !!(hpd_status & BIT(0));
 156		wake_up_all(&lt9611uxc->wq);
 157	}
 158
 159	if (irq_status & BIT(1)) {
 160		lt9611uxc->hdmi_connected = hpd_status & BIT(1);
 161		schedule_work(&lt9611uxc->work);
 162	}
 163
 164	lt9611uxc_unlock(lt9611uxc);
 165
 166	return IRQ_HANDLED;
 167}
 168
 169static void lt9611uxc_hpd_work(struct work_struct *work)
 170{
 171	struct lt9611uxc *lt9611uxc = container_of(work, struct lt9611uxc, work);
 172	bool connected;
 173
 174	if (lt9611uxc->connector.dev) {
 175		if (lt9611uxc->connector.dev->mode_config.funcs)
 176			drm_kms_helper_hotplug_event(lt9611uxc->connector.dev);
 177	} else {
 178
 179		mutex_lock(&lt9611uxc->ocm_lock);
 180		connected = lt9611uxc->hdmi_connected;
 181		mutex_unlock(&lt9611uxc->ocm_lock);
 182
 183		drm_bridge_hpd_notify(&lt9611uxc->bridge,
 184				      connected ?
 185				      connector_status_connected :
 186				      connector_status_disconnected);
 187	}
 188}
 189
 190static void lt9611uxc_reset(struct lt9611uxc *lt9611uxc)
 191{
 192	gpiod_set_value_cansleep(lt9611uxc->reset_gpio, 1);
 193	msleep(20);
 194
 195	gpiod_set_value_cansleep(lt9611uxc->reset_gpio, 0);
 196	msleep(20);
 197
 198	gpiod_set_value_cansleep(lt9611uxc->reset_gpio, 1);
 199	msleep(300);
 200}
 201
 202static void lt9611uxc_assert_5v(struct lt9611uxc *lt9611uxc)
 203{
 204	if (!lt9611uxc->enable_gpio)
 205		return;
 206
 207	gpiod_set_value_cansleep(lt9611uxc->enable_gpio, 1);
 208	msleep(20);
 209}
 210
 211static int lt9611uxc_regulator_init(struct lt9611uxc *lt9611uxc)
 212{
 213	int ret;
 214
 215	lt9611uxc->supplies[0].supply = "vdd";
 216	lt9611uxc->supplies[1].supply = "vcc";
 217
 218	ret = devm_regulator_bulk_get(lt9611uxc->dev, 2, lt9611uxc->supplies);
 219	if (ret < 0)
 220		return ret;
 221
 222	return regulator_set_load(lt9611uxc->supplies[0].consumer, 200000);
 223}
 224
 225static int lt9611uxc_regulator_enable(struct lt9611uxc *lt9611uxc)
 226{
 227	int ret;
 228
 229	ret = regulator_enable(lt9611uxc->supplies[0].consumer);
 230	if (ret < 0)
 231		return ret;
 232
 233	usleep_range(1000, 10000); /* 50000 according to dtsi */
 234
 235	ret = regulator_enable(lt9611uxc->supplies[1].consumer);
 236	if (ret < 0) {
 237		regulator_disable(lt9611uxc->supplies[0].consumer);
 238		return ret;
 239	}
 240
 241	return 0;
 242}
 243
 244static struct lt9611uxc_mode *lt9611uxc_find_mode(const struct drm_display_mode *mode)
 245{
 246	int i;
 247
 248	for (i = 0; i < ARRAY_SIZE(lt9611uxc_modes); i++) {
 249		if (lt9611uxc_modes[i].hdisplay == mode->hdisplay &&
 250		    lt9611uxc_modes[i].vdisplay == mode->vdisplay &&
 251		    lt9611uxc_modes[i].vrefresh == drm_mode_vrefresh(mode)) {
 252			return &lt9611uxc_modes[i];
 253		}
 254	}
 255
 256	return NULL;
 257}
 258
 259static struct mipi_dsi_device *lt9611uxc_attach_dsi(struct lt9611uxc *lt9611uxc,
 260						    struct device_node *dsi_node)
 261{
 262	const struct mipi_dsi_device_info info = { "lt9611uxc", 0, NULL };
 263	struct mipi_dsi_device *dsi;
 264	struct mipi_dsi_host *host;
 265	struct device *dev = lt9611uxc->dev;
 266	int ret;
 267
 268	host = of_find_mipi_dsi_host_by_node(dsi_node);
 269	if (!host)
 270		return ERR_PTR(dev_err_probe(dev, -EPROBE_DEFER, "failed to find dsi host\n"));
 271
 272	dsi = devm_mipi_dsi_device_register_full(dev, host, &info);
 273	if (IS_ERR(dsi)) {
 274		dev_err(dev, "failed to create dsi device\n");
 275		return dsi;
 276	}
 277
 278	dsi->lanes = 4;
 279	dsi->format = MIPI_DSI_FMT_RGB888;
 280	dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
 281			  MIPI_DSI_MODE_VIDEO_HSE;
 282
 283	ret = devm_mipi_dsi_attach(dev, dsi);
 284	if (ret < 0) {
 285		dev_err(dev, "failed to attach dsi to host\n");
 286		return ERR_PTR(ret);
 287	}
 288
 289	return dsi;
 290}
 291
 292static int lt9611uxc_connector_get_modes(struct drm_connector *connector)
 293{
 294	struct lt9611uxc *lt9611uxc = connector_to_lt9611uxc(connector);
 295	const struct drm_edid *drm_edid;
 296	int count;
 297
 298	drm_edid = drm_bridge_edid_read(&lt9611uxc->bridge, connector);
 299	drm_edid_connector_update(connector, drm_edid);
 300	count = drm_edid_connector_add_modes(connector);
 301	drm_edid_free(drm_edid);
 302
 303	return count;
 304}
 305
 306static enum drm_connector_status lt9611uxc_connector_detect(struct drm_connector *connector,
 307							    bool force)
 308{
 309	struct lt9611uxc *lt9611uxc = connector_to_lt9611uxc(connector);
 310
 311	return lt9611uxc->bridge.funcs->detect(&lt9611uxc->bridge);
 312}
 313
 314static enum drm_mode_status lt9611uxc_connector_mode_valid(struct drm_connector *connector,
 315							   struct drm_display_mode *mode)
 316{
 317	struct lt9611uxc_mode *lt9611uxc_mode = lt9611uxc_find_mode(mode);
 318
 319	return lt9611uxc_mode ? MODE_OK : MODE_BAD;
 320}
 321
 322static const struct drm_connector_helper_funcs lt9611uxc_bridge_connector_helper_funcs = {
 323	.get_modes = lt9611uxc_connector_get_modes,
 324	.mode_valid = lt9611uxc_connector_mode_valid,
 325};
 326
 327static const struct drm_connector_funcs lt9611uxc_bridge_connector_funcs = {
 328	.fill_modes = drm_helper_probe_single_connector_modes,
 329	.detect = lt9611uxc_connector_detect,
 330	.destroy = drm_connector_cleanup,
 331	.reset = drm_atomic_helper_connector_reset,
 332	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
 333	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
 334};
 335
 336static int lt9611uxc_connector_init(struct drm_bridge *bridge, struct lt9611uxc *lt9611uxc)
 337{
 338	int ret;
 339
 340	if (!bridge->encoder) {
 341		DRM_ERROR("Parent encoder object not found");
 342		return -ENODEV;
 343	}
 344
 345	lt9611uxc->connector.polled = DRM_CONNECTOR_POLL_HPD;
 346
 347	drm_connector_helper_add(&lt9611uxc->connector,
 348				 &lt9611uxc_bridge_connector_helper_funcs);
 349	ret = drm_connector_init(bridge->dev, &lt9611uxc->connector,
 350				 &lt9611uxc_bridge_connector_funcs,
 351				 DRM_MODE_CONNECTOR_HDMIA);
 352	if (ret) {
 353		DRM_ERROR("Failed to initialize connector with drm\n");
 354		return ret;
 355	}
 356
 357	return drm_connector_attach_encoder(&lt9611uxc->connector, bridge->encoder);
 358}
 359
 360static int lt9611uxc_bridge_attach(struct drm_bridge *bridge,
 361				   enum drm_bridge_attach_flags flags)
 362{
 363	struct lt9611uxc *lt9611uxc = bridge_to_lt9611uxc(bridge);
 364	int ret;
 365
 366	if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)) {
 367		ret = lt9611uxc_connector_init(bridge, lt9611uxc);
 368		if (ret < 0)
 369			return ret;
 370	}
 371
 372	return 0;
 373}
 374
 375static enum drm_mode_status
 376lt9611uxc_bridge_mode_valid(struct drm_bridge *bridge,
 377			    const struct drm_display_info *info,
 378			    const struct drm_display_mode *mode)
 379{
 380	struct lt9611uxc_mode *lt9611uxc_mode;
 381
 382	lt9611uxc_mode = lt9611uxc_find_mode(mode);
 383
 384	return lt9611uxc_mode ? MODE_OK : MODE_BAD;
 385}
 386
 387static void lt9611uxc_video_setup(struct lt9611uxc *lt9611uxc,
 388				  const struct drm_display_mode *mode)
 389{
 390	u32 h_total, hactive, hsync_len, hfront_porch;
 391	u32 v_total, vactive, vsync_len, vfront_porch;
 392
 393	h_total = mode->htotal;
 394	v_total = mode->vtotal;
 395
 396	hactive = mode->hdisplay;
 397	hsync_len = mode->hsync_end - mode->hsync_start;
 398	hfront_porch = mode->hsync_start - mode->hdisplay;
 399
 400	vactive = mode->vdisplay;
 401	vsync_len = mode->vsync_end - mode->vsync_start;
 402	vfront_porch = mode->vsync_start - mode->vdisplay;
 403
 404	regmap_write(lt9611uxc->regmap, 0xd00d, (u8)(v_total / 256));
 405	regmap_write(lt9611uxc->regmap, 0xd00e, (u8)(v_total % 256));
 406
 407	regmap_write(lt9611uxc->regmap, 0xd00f, (u8)(vactive / 256));
 408	regmap_write(lt9611uxc->regmap, 0xd010, (u8)(vactive % 256));
 409
 410	regmap_write(lt9611uxc->regmap, 0xd011, (u8)(h_total / 256));
 411	regmap_write(lt9611uxc->regmap, 0xd012, (u8)(h_total % 256));
 412
 413	regmap_write(lt9611uxc->regmap, 0xd013, (u8)(hactive / 256));
 414	regmap_write(lt9611uxc->regmap, 0xd014, (u8)(hactive % 256));
 415
 416	regmap_write(lt9611uxc->regmap, 0xd015, (u8)(vsync_len % 256));
 417
 418	regmap_update_bits(lt9611uxc->regmap, 0xd016, 0xf, (u8)(hsync_len / 256));
 419	regmap_write(lt9611uxc->regmap, 0xd017, (u8)(hsync_len % 256));
 420
 421	regmap_update_bits(lt9611uxc->regmap, 0xd018, 0xf, (u8)(vfront_porch / 256));
 422	regmap_write(lt9611uxc->regmap, 0xd019, (u8)(vfront_porch % 256));
 423
 424	regmap_update_bits(lt9611uxc->regmap, 0xd01a, 0xf, (u8)(hfront_porch / 256));
 425	regmap_write(lt9611uxc->regmap, 0xd01b, (u8)(hfront_porch % 256));
 426}
 427
 428static void lt9611uxc_bridge_mode_set(struct drm_bridge *bridge,
 429				      const struct drm_display_mode *mode,
 430				      const struct drm_display_mode *adj_mode)
 431{
 432	struct lt9611uxc *lt9611uxc = bridge_to_lt9611uxc(bridge);
 433
 434	lt9611uxc_lock(lt9611uxc);
 435	lt9611uxc_video_setup(lt9611uxc, mode);
 436	lt9611uxc_unlock(lt9611uxc);
 437}
 438
 439static enum drm_connector_status lt9611uxc_bridge_detect(struct drm_bridge *bridge)
 440{
 441	struct lt9611uxc *lt9611uxc = bridge_to_lt9611uxc(bridge);
 442	unsigned int reg_val = 0;
 443	int ret;
 444	bool connected = true;
 445
 446	lt9611uxc_lock(lt9611uxc);
 447
 448	if (lt9611uxc->hpd_supported) {
 449		ret = regmap_read(lt9611uxc->regmap, 0xb023, &reg_val);
 450
 451		if (ret)
 452			dev_err(lt9611uxc->dev, "failed to read hpd status: %d\n", ret);
 453		else
 454			connected  = reg_val & BIT(1);
 455	}
 456	lt9611uxc->hdmi_connected = connected;
 457
 458	lt9611uxc_unlock(lt9611uxc);
 459
 460	return connected ?  connector_status_connected :
 461				connector_status_disconnected;
 462}
 463
 464static int lt9611uxc_wait_for_edid(struct lt9611uxc *lt9611uxc)
 465{
 466	return wait_event_interruptible_timeout(lt9611uxc->wq, lt9611uxc->edid_read,
 467			msecs_to_jiffies(500));
 468}
 469
 470static int lt9611uxc_get_edid_block(void *data, u8 *buf, unsigned int block, size_t len)
 471{
 472	struct lt9611uxc *lt9611uxc = data;
 473	int ret;
 474
 475	if (len > EDID_BLOCK_SIZE)
 476		return -EINVAL;
 477
 478	if (block >= EDID_NUM_BLOCKS)
 479		return -EINVAL;
 480
 481	lt9611uxc_lock(lt9611uxc);
 482
 483	regmap_write(lt9611uxc->regmap, 0xb00b, 0x10);
 484
 485	regmap_write(lt9611uxc->regmap, 0xb00a, block * EDID_BLOCK_SIZE);
 486
 487	ret = regmap_noinc_read(lt9611uxc->regmap, 0xb0b0, buf, len);
 488	if (ret)
 489		dev_err(lt9611uxc->dev, "edid read failed: %d\n", ret);
 490
 491	lt9611uxc_unlock(lt9611uxc);
 492
 493	return 0;
 494};
 495
 496static const struct drm_edid *lt9611uxc_bridge_edid_read(struct drm_bridge *bridge,
 497							 struct drm_connector *connector)
 498{
 499	struct lt9611uxc *lt9611uxc = bridge_to_lt9611uxc(bridge);
 500	int ret;
 501
 502	ret = lt9611uxc_wait_for_edid(lt9611uxc);
 503	if (ret < 0) {
 504		dev_err(lt9611uxc->dev, "wait for EDID failed: %d\n", ret);
 505		return NULL;
 506	} else if (ret == 0) {
 507		dev_err(lt9611uxc->dev, "wait for EDID timeout\n");
 508		return NULL;
 509	}
 510
 511	return drm_edid_read_custom(connector, lt9611uxc_get_edid_block, lt9611uxc);
 512}
 513
 514static const struct drm_bridge_funcs lt9611uxc_bridge_funcs = {
 515	.attach = lt9611uxc_bridge_attach,
 516	.mode_valid = lt9611uxc_bridge_mode_valid,
 517	.mode_set = lt9611uxc_bridge_mode_set,
 518	.detect = lt9611uxc_bridge_detect,
 519	.edid_read = lt9611uxc_bridge_edid_read,
 520};
 521
 522static int lt9611uxc_parse_dt(struct device *dev,
 523			      struct lt9611uxc *lt9611uxc)
 524{
 525	lt9611uxc->dsi0_node = of_graph_get_remote_node(dev->of_node, 0, -1);
 526	if (!lt9611uxc->dsi0_node) {
 527		dev_err(lt9611uxc->dev, "failed to get remote node for primary dsi\n");
 528		return -ENODEV;
 529	}
 530
 531	lt9611uxc->dsi1_node = of_graph_get_remote_node(dev->of_node, 1, -1);
 532
 533	return 0;
 534}
 535
 536static int lt9611uxc_gpio_init(struct lt9611uxc *lt9611uxc)
 537{
 538	struct device *dev = lt9611uxc->dev;
 539
 540	lt9611uxc->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
 541	if (IS_ERR(lt9611uxc->reset_gpio)) {
 542		dev_err(dev, "failed to acquire reset gpio\n");
 543		return PTR_ERR(lt9611uxc->reset_gpio);
 544	}
 545
 546	lt9611uxc->enable_gpio = devm_gpiod_get_optional(dev, "enable", GPIOD_OUT_LOW);
 547	if (IS_ERR(lt9611uxc->enable_gpio)) {
 548		dev_err(dev, "failed to acquire enable gpio\n");
 549		return PTR_ERR(lt9611uxc->enable_gpio);
 550	}
 551
 552	return 0;
 553}
 554
 555static int lt9611uxc_read_device_rev(struct lt9611uxc *lt9611uxc)
 556{
 557	unsigned int rev0, rev1, rev2;
 558	int ret;
 559
 560	lt9611uxc_lock(lt9611uxc);
 561
 562	ret = regmap_read(lt9611uxc->regmap, 0x8100, &rev0);
 563	ret |= regmap_read(lt9611uxc->regmap, 0x8101, &rev1);
 564	ret |= regmap_read(lt9611uxc->regmap, 0x8102, &rev2);
 565	if (ret)
 566		dev_err(lt9611uxc->dev, "failed to read revision: %d\n", ret);
 567	else
 568		dev_info(lt9611uxc->dev, "LT9611 revision: 0x%02x.%02x.%02x\n", rev0, rev1, rev2);
 569
 570	lt9611uxc_unlock(lt9611uxc);
 571
 572	return ret;
 573}
 574
 575static int lt9611uxc_read_version(struct lt9611uxc *lt9611uxc)
 576{
 577	unsigned int rev;
 578	int ret;
 579
 580	lt9611uxc_lock(lt9611uxc);
 581
 582	ret = regmap_read(lt9611uxc->regmap, 0xb021, &rev);
 583	if (ret)
 584		dev_err(lt9611uxc->dev, "failed to read revision: %d\n", ret);
 585	else
 586		dev_info(lt9611uxc->dev, "LT9611 version: 0x%02x\n", rev);
 587
 588	lt9611uxc_unlock(lt9611uxc);
 589
 590	return ret < 0 ? ret : rev;
 591}
 592
 593static int lt9611uxc_hdmi_hw_params(struct device *dev, void *data,
 594				    struct hdmi_codec_daifmt *fmt,
 595				    struct hdmi_codec_params *hparms)
 596{
 597	/*
 598	 * LT9611UXC will automatically detect rate and sample size, so no need
 599	 * to setup anything here.
 600	 */
 601	return 0;
 602}
 603
 604static void lt9611uxc_audio_shutdown(struct device *dev, void *data)
 605{
 606}
 607
 608static int lt9611uxc_hdmi_i2s_get_dai_id(struct snd_soc_component *component,
 609					 struct device_node *endpoint)
 610{
 611	struct of_endpoint of_ep;
 612	int ret;
 613
 614	ret = of_graph_parse_endpoint(endpoint, &of_ep);
 615	if (ret < 0)
 616		return ret;
 617
 618	/*
 619	 * HDMI sound should be located as reg = <2>
 620	 * Then, it is sound port 0
 621	 */
 622	if (of_ep.port == 2)
 623		return 0;
 624
 625	return -EINVAL;
 626}
 627
 628static const struct hdmi_codec_ops lt9611uxc_codec_ops = {
 629	.hw_params	= lt9611uxc_hdmi_hw_params,
 630	.audio_shutdown = lt9611uxc_audio_shutdown,
 631	.get_dai_id	= lt9611uxc_hdmi_i2s_get_dai_id,
 632};
 633
 634static int lt9611uxc_audio_init(struct device *dev, struct lt9611uxc *lt9611uxc)
 635{
 636	struct hdmi_codec_pdata codec_data = {
 637		.ops = &lt9611uxc_codec_ops,
 638		.max_i2s_channels = 2,
 639		.i2s = 1,
 640		.data = lt9611uxc,
 641	};
 642
 643	lt9611uxc->audio_pdev =
 644		platform_device_register_data(dev, HDMI_CODEC_DRV_NAME,
 645					      PLATFORM_DEVID_AUTO,
 646					      &codec_data, sizeof(codec_data));
 647
 648	return PTR_ERR_OR_ZERO(lt9611uxc->audio_pdev);
 649}
 650
 651static void lt9611uxc_audio_exit(struct lt9611uxc *lt9611uxc)
 652{
 653	if (lt9611uxc->audio_pdev) {
 654		platform_device_unregister(lt9611uxc->audio_pdev);
 655		lt9611uxc->audio_pdev = NULL;
 656	}
 657}
 658
 659#define LT9611UXC_FW_PAGE_SIZE 32
 660static void lt9611uxc_firmware_write_page(struct lt9611uxc *lt9611uxc, u16 addr, const u8 *buf)
 661{
 662	struct reg_sequence seq_write_prepare[] = {
 663		REG_SEQ0(0x805a, 0x04),
 664		REG_SEQ0(0x805a, 0x00),
 665
 666		REG_SEQ0(0x805e, 0xdf),
 667		REG_SEQ0(0x805a, 0x20),
 668		REG_SEQ0(0x805a, 0x00),
 669		REG_SEQ0(0x8058, 0x21),
 670	};
 671
 672	struct reg_sequence seq_write_addr[] = {
 673		REG_SEQ0(0x805b, (addr >> 16) & 0xff),
 674		REG_SEQ0(0x805c, (addr >> 8) & 0xff),
 675		REG_SEQ0(0x805d, addr & 0xff),
 676		REG_SEQ0(0x805a, 0x10),
 677		REG_SEQ0(0x805a, 0x00),
 678	};
 679
 680	regmap_write(lt9611uxc->regmap, 0x8108, 0xbf);
 681	msleep(20);
 682	regmap_write(lt9611uxc->regmap, 0x8108, 0xff);
 683	msleep(20);
 684	regmap_multi_reg_write(lt9611uxc->regmap, seq_write_prepare, ARRAY_SIZE(seq_write_prepare));
 685	regmap_noinc_write(lt9611uxc->regmap, 0x8059, buf, LT9611UXC_FW_PAGE_SIZE);
 686	regmap_multi_reg_write(lt9611uxc->regmap, seq_write_addr, ARRAY_SIZE(seq_write_addr));
 687	msleep(20);
 688}
 689
 690static void lt9611uxc_firmware_read_page(struct lt9611uxc *lt9611uxc, u16 addr, char *buf)
 691{
 692	struct reg_sequence seq_read_page[] = {
 693		REG_SEQ0(0x805a, 0xa0),
 694		REG_SEQ0(0x805a, 0x80),
 695		REG_SEQ0(0x805b, (addr >> 16) & 0xff),
 696		REG_SEQ0(0x805c, (addr >> 8) & 0xff),
 697		REG_SEQ0(0x805d, addr & 0xff),
 698		REG_SEQ0(0x805a, 0x90),
 699		REG_SEQ0(0x805a, 0x80),
 700		REG_SEQ0(0x8058, 0x21),
 701	};
 702
 703	regmap_multi_reg_write(lt9611uxc->regmap, seq_read_page, ARRAY_SIZE(seq_read_page));
 704	regmap_noinc_read(lt9611uxc->regmap, 0x805f, buf, LT9611UXC_FW_PAGE_SIZE);
 705}
 706
 707static char *lt9611uxc_firmware_read(struct lt9611uxc *lt9611uxc, size_t size)
 708{
 709	struct reg_sequence seq_read_setup[] = {
 710		REG_SEQ0(0x805a, 0x84),
 711		REG_SEQ0(0x805a, 0x80),
 712	};
 713
 714	char *readbuf;
 715	u16 offset;
 716
 717	readbuf = kzalloc(ALIGN(size, 32), GFP_KERNEL);
 718	if (!readbuf)
 719		return NULL;
 720
 721	regmap_multi_reg_write(lt9611uxc->regmap, seq_read_setup, ARRAY_SIZE(seq_read_setup));
 722
 723	for (offset = 0;
 724	     offset < size;
 725	     offset += LT9611UXC_FW_PAGE_SIZE)
 726		lt9611uxc_firmware_read_page(lt9611uxc, offset, &readbuf[offset]);
 727
 728	return readbuf;
 729}
 730
 731static int lt9611uxc_firmware_update(struct lt9611uxc *lt9611uxc)
 732{
 733	int ret;
 734	u16 offset;
 735	size_t remain;
 736	char *readbuf;
 737	const struct firmware *fw;
 738
 739	struct reg_sequence seq_setup[] = {
 740		REG_SEQ0(0x805e, 0xdf),
 741		REG_SEQ0(0x8058, 0x00),
 742		REG_SEQ0(0x8059, 0x50),
 743		REG_SEQ0(0x805a, 0x10),
 744		REG_SEQ0(0x805a, 0x00),
 745	};
 746
 747
 748	struct reg_sequence seq_block_erase[] = {
 749		REG_SEQ0(0x805a, 0x04),
 750		REG_SEQ0(0x805a, 0x00),
 751		REG_SEQ0(0x805b, 0x00),
 752		REG_SEQ0(0x805c, 0x00),
 753		REG_SEQ0(0x805d, 0x00),
 754		REG_SEQ0(0x805a, 0x01),
 755		REG_SEQ0(0x805a, 0x00),
 756	};
 757
 758	ret = request_firmware(&fw, FW_FILE, lt9611uxc->dev);
 759	if (ret < 0)
 760		return ret;
 761
 762	dev_info(lt9611uxc->dev, "Updating firmware\n");
 763	lt9611uxc_lock(lt9611uxc);
 764
 765	regmap_multi_reg_write(lt9611uxc->regmap, seq_setup, ARRAY_SIZE(seq_setup));
 766
 767	/*
 768	 * Need erase block 2 timess here. Sometimes, block erase can fail.
 769	 * This is a workaroud.
 770	 */
 771	regmap_multi_reg_write(lt9611uxc->regmap, seq_block_erase, ARRAY_SIZE(seq_block_erase));
 772	msleep(3000);
 773	regmap_multi_reg_write(lt9611uxc->regmap, seq_block_erase, ARRAY_SIZE(seq_block_erase));
 774	msleep(3000);
 775
 776	for (offset = 0, remain = fw->size;
 777	     remain >= LT9611UXC_FW_PAGE_SIZE;
 778	     offset += LT9611UXC_FW_PAGE_SIZE, remain -= LT9611UXC_FW_PAGE_SIZE)
 779		lt9611uxc_firmware_write_page(lt9611uxc, offset, fw->data + offset);
 780
 781	if (remain > 0) {
 782		char buf[LT9611UXC_FW_PAGE_SIZE];
 783
 784		memset(buf, 0xff, LT9611UXC_FW_PAGE_SIZE);
 785		memcpy(buf, fw->data + offset, remain);
 786		lt9611uxc_firmware_write_page(lt9611uxc, offset, buf);
 787	}
 788	msleep(20);
 789
 790	readbuf = lt9611uxc_firmware_read(lt9611uxc, fw->size);
 791	if (!readbuf) {
 792		ret = -ENOMEM;
 793		goto out;
 794	}
 795
 796	if (!memcmp(readbuf, fw->data, fw->size)) {
 797		dev_err(lt9611uxc->dev, "Firmware update failed\n");
 798		print_hex_dump(KERN_ERR, "fw: ", DUMP_PREFIX_OFFSET, 16, 1, readbuf, fw->size, false);
 799		ret = -EINVAL;
 800	} else {
 801		dev_info(lt9611uxc->dev, "Firmware updates successfully\n");
 802		ret = 0;
 803	}
 804	kfree(readbuf);
 805
 806out:
 807	lt9611uxc_unlock(lt9611uxc);
 808	lt9611uxc_reset(lt9611uxc);
 809	release_firmware(fw);
 810
 811	return ret;
 812}
 813
 814static ssize_t lt9611uxc_firmware_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t len)
 815{
 816	struct lt9611uxc *lt9611uxc = dev_get_drvdata(dev);
 817	int ret;
 818
 819	ret = lt9611uxc_firmware_update(lt9611uxc);
 820	if (ret < 0)
 821		return ret;
 822	return len;
 823}
 824
 825static ssize_t lt9611uxc_firmware_show(struct device *dev, struct device_attribute *attr, char *buf)
 826{
 827	struct lt9611uxc *lt9611uxc = dev_get_drvdata(dev);
 828
 829	return sysfs_emit(buf, "%02x\n", lt9611uxc->fw_version);
 830}
 831
 832static DEVICE_ATTR_RW(lt9611uxc_firmware);
 833
 834static struct attribute *lt9611uxc_attrs[] = {
 835	&dev_attr_lt9611uxc_firmware.attr,
 836	NULL,
 837};
 838
 839static const struct attribute_group lt9611uxc_attr_group = {
 840	.attrs = lt9611uxc_attrs,
 841};
 842
 843static const struct attribute_group *lt9611uxc_attr_groups[] = {
 844	&lt9611uxc_attr_group,
 845	NULL,
 846};
 847
 848static int lt9611uxc_probe(struct i2c_client *client)
 849{
 850	struct lt9611uxc *lt9611uxc;
 851	struct device *dev = &client->dev;
 852	int ret;
 853	bool fw_updated = false;
 854
 855	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
 856		dev_err(dev, "device doesn't support I2C\n");
 857		return -ENODEV;
 858	}
 859
 860	lt9611uxc = devm_kzalloc(dev, sizeof(*lt9611uxc), GFP_KERNEL);
 861	if (!lt9611uxc)
 862		return -ENOMEM;
 863
 864	lt9611uxc->dev = dev;
 865	lt9611uxc->client = client;
 866	mutex_init(&lt9611uxc->ocm_lock);
 867
 868	lt9611uxc->regmap = devm_regmap_init_i2c(client, &lt9611uxc_regmap_config);
 869	if (IS_ERR(lt9611uxc->regmap)) {
 870		dev_err(lt9611uxc->dev, "regmap i2c init failed\n");
 871		return PTR_ERR(lt9611uxc->regmap);
 872	}
 873
 874	ret = lt9611uxc_parse_dt(dev, lt9611uxc);
 875	if (ret) {
 876		dev_err(dev, "failed to parse device tree\n");
 877		return ret;
 878	}
 879
 880	ret = lt9611uxc_gpio_init(lt9611uxc);
 881	if (ret < 0)
 882		goto err_of_put;
 883
 884	ret = lt9611uxc_regulator_init(lt9611uxc);
 885	if (ret < 0)
 886		goto err_of_put;
 887
 888	lt9611uxc_assert_5v(lt9611uxc);
 889
 890	ret = lt9611uxc_regulator_enable(lt9611uxc);
 891	if (ret)
 892		goto err_of_put;
 893
 894	lt9611uxc_reset(lt9611uxc);
 895
 896	ret = lt9611uxc_read_device_rev(lt9611uxc);
 897	if (ret) {
 898		dev_err(dev, "failed to read chip rev\n");
 899		goto err_disable_regulators;
 900	}
 901
 902retry:
 903	ret = lt9611uxc_read_version(lt9611uxc);
 904	if (ret < 0) {
 905		dev_err(dev, "failed to read FW version\n");
 906		goto err_disable_regulators;
 907	} else if (ret == 0) {
 908		if (!fw_updated) {
 909			fw_updated = true;
 910			dev_err(dev, "FW version 0, enforcing firmware update\n");
 911			ret = lt9611uxc_firmware_update(lt9611uxc);
 912			if (ret < 0)
 913				goto err_disable_regulators;
 914			else
 915				goto retry;
 916		} else {
 917			dev_err(dev, "FW version 0, update failed\n");
 918			ret = -EOPNOTSUPP;
 919			goto err_disable_regulators;
 920		}
 921	} else if (ret < 0x40) {
 922		dev_info(dev, "FW version 0x%x, HPD not supported\n", ret);
 923	} else {
 924		lt9611uxc->hpd_supported = true;
 925	}
 926	lt9611uxc->fw_version = ret;
 927
 928	init_waitqueue_head(&lt9611uxc->wq);
 929	INIT_WORK(&lt9611uxc->work, lt9611uxc_hpd_work);
 930
 931	ret = request_threaded_irq(client->irq, NULL,
 932				   lt9611uxc_irq_thread_handler,
 933				   IRQF_ONESHOT, "lt9611uxc", lt9611uxc);
 934	if (ret) {
 935		dev_err(dev, "failed to request irq\n");
 936		goto err_disable_regulators;
 937	}
 938
 939	i2c_set_clientdata(client, lt9611uxc);
 940
 941	lt9611uxc->bridge.funcs = &lt9611uxc_bridge_funcs;
 942	lt9611uxc->bridge.of_node = client->dev.of_node;
 943	lt9611uxc->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID;
 944	if (lt9611uxc->hpd_supported)
 945		lt9611uxc->bridge.ops |= DRM_BRIDGE_OP_HPD;
 946	lt9611uxc->bridge.type = DRM_MODE_CONNECTOR_HDMIA;
 947
 948	drm_bridge_add(&lt9611uxc->bridge);
 949
 950	/* Attach primary DSI */
 951	lt9611uxc->dsi0 = lt9611uxc_attach_dsi(lt9611uxc, lt9611uxc->dsi0_node);
 952	if (IS_ERR(lt9611uxc->dsi0)) {
 953		ret = PTR_ERR(lt9611uxc->dsi0);
 954		goto err_remove_bridge;
 955	}
 956
 957	/* Attach secondary DSI, if specified */
 958	if (lt9611uxc->dsi1_node) {
 959		lt9611uxc->dsi1 = lt9611uxc_attach_dsi(lt9611uxc, lt9611uxc->dsi1_node);
 960		if (IS_ERR(lt9611uxc->dsi1)) {
 961			ret = PTR_ERR(lt9611uxc->dsi1);
 962			goto err_remove_bridge;
 963		}
 964	}
 965
 966	return lt9611uxc_audio_init(dev, lt9611uxc);
 967
 968err_remove_bridge:
 969	free_irq(client->irq, lt9611uxc);
 970	cancel_work_sync(&lt9611uxc->work);
 971	drm_bridge_remove(&lt9611uxc->bridge);
 972
 973err_disable_regulators:
 974	regulator_bulk_disable(ARRAY_SIZE(lt9611uxc->supplies), lt9611uxc->supplies);
 975
 976err_of_put:
 977	of_node_put(lt9611uxc->dsi1_node);
 978	of_node_put(lt9611uxc->dsi0_node);
 979
 980	return ret;
 981}
 982
 983static void lt9611uxc_remove(struct i2c_client *client)
 984{
 985	struct lt9611uxc *lt9611uxc = i2c_get_clientdata(client);
 986
 987	free_irq(client->irq, lt9611uxc);
 988	cancel_work_sync(&lt9611uxc->work);
 989	lt9611uxc_audio_exit(lt9611uxc);
 990	drm_bridge_remove(&lt9611uxc->bridge);
 991
 992	mutex_destroy(&lt9611uxc->ocm_lock);
 993
 994	regulator_bulk_disable(ARRAY_SIZE(lt9611uxc->supplies), lt9611uxc->supplies);
 995
 996	of_node_put(lt9611uxc->dsi1_node);
 997	of_node_put(lt9611uxc->dsi0_node);
 998}
 999
1000static struct i2c_device_id lt9611uxc_id[] = {
1001	{ "lontium,lt9611uxc", 0 },
1002	{ /* sentinel */ }
1003};
1004
1005static const struct of_device_id lt9611uxc_match_table[] = {
1006	{ .compatible = "lontium,lt9611uxc" },
1007	{ /* sentinel */ }
1008};
1009MODULE_DEVICE_TABLE(of, lt9611uxc_match_table);
1010
1011static struct i2c_driver lt9611uxc_driver = {
1012	.driver = {
1013		.name = "lt9611uxc",
1014		.of_match_table = lt9611uxc_match_table,
1015		.dev_groups = lt9611uxc_attr_groups,
1016	},
1017	.probe = lt9611uxc_probe,
1018	.remove = lt9611uxc_remove,
1019	.id_table = lt9611uxc_id,
1020};
1021module_i2c_driver(lt9611uxc_driver);
1022
1023MODULE_AUTHOR("Dmitry Baryshkov <dmitry.baryshkov@linaro.org>");
1024MODULE_LICENSE("GPL v2");
1025
1026MODULE_FIRMWARE(FW_FILE);