mirror of
https://github.com/genesi/linux-legacy.git
synced 2026-09-18 20:54:26 +00:00
siihdmi: add siihdmi_platform_data
SII9022 requires some platform specific data that was previously hardcoded into the driver. Create a new siihdmi_platform_data struct to actually get this information. This allows a particular vendor to supply the IRQ vector, the reset method, the framebuffer id, as well as the vendor/description for the SPD block currently.
This commit is contained in:
@@ -23,6 +23,8 @@
|
||||
#include <mach/gpio.h>
|
||||
#include <mach/irqs.h>
|
||||
|
||||
#include <linux/i2c/sii_hdmi.h>
|
||||
|
||||
#include "devices.h"
|
||||
#include "mx51_pins.h"
|
||||
#include "iomux.h"
|
||||
@@ -62,12 +64,25 @@ static struct mxc_lcd_platform_data mx51_efikamx_cs8556_data = {
|
||||
.reset = mx51_efikamx_display_reset,
|
||||
};
|
||||
|
||||
#if 0
|
||||
static struct mxc_lcd_platform_data mx51_efikamx_sii9022_data = {
|
||||
.core_reg = "VGEN1",
|
||||
.io_reg = "VGEN3",
|
||||
.reset = mx51_efikamx_display_reset,
|
||||
.hotplug_irq = IOMUX_TO_IRQ(MX51_PIN_DISPB2_SER_DIO),
|
||||
};
|
||||
#endif
|
||||
|
||||
static struct siihdmi_platform_data mx51_efikamx_sii9022_data = {
|
||||
.reset = mx51_efikamx_display_reset,
|
||||
|
||||
.vendor = "Genesi",
|
||||
.description = "Efika MX",
|
||||
|
||||
.framebuffer = "DISP3 BG",
|
||||
|
||||
.hotplug_irq = IOMUX_TO_IRQ(MX51_PIN_DISPB2_SER_DIO),
|
||||
};
|
||||
|
||||
static struct i2c_board_info mx51_efikamx_i2c_board_info[] __initdata = {
|
||||
{
|
||||
|
||||
@@ -493,14 +493,16 @@ static int siihdmi_set_spd_info_frame(struct siihdmi_tx *tx)
|
||||
.length = sizeof(packet.info_frame) - sizeof(packet.info_frame.header),
|
||||
},
|
||||
|
||||
/* TODO this should be in platform data */
|
||||
.vendor = "Genesi",
|
||||
.description = "Efika MX",
|
||||
|
||||
.source_device_info = SPD_SOURCE_PC_GENERAL,
|
||||
},
|
||||
};
|
||||
|
||||
strncpy(packet.info_frame.vendor, tx->platform->vendor,
|
||||
sizeof(packet.info_frame.vendor));
|
||||
|
||||
strncpy(packet.info_frame.description, tx->platform->description,
|
||||
sizeof(packet.info_frame.description));
|
||||
|
||||
cea861_checksum_hdmi_info_frame((u8 *) &packet.info_frame);
|
||||
|
||||
BUILD_BUG_ON(sizeof(packet) != SIIHDMI_TPI_REG_MISC_INFO_FRAME_LENGTH);
|
||||
@@ -933,9 +935,6 @@ static void siihdmi_hotplug_event(struct work_struct *work)
|
||||
static int __devinit siihdmi_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
#ifdef CONFIG_SIIHDMI_HOTPLUG
|
||||
struct mxc_lcd_platform_data *plat = client->dev.platform_data;
|
||||
#endif
|
||||
struct siihdmi_tx *tx;
|
||||
int i, ret;
|
||||
|
||||
@@ -944,18 +943,20 @@ static int __devinit siihdmi_probe(struct i2c_client *client,
|
||||
return -ENOMEM;
|
||||
|
||||
tx->client = client;
|
||||
|
||||
i2c_set_clientdata(client, tx);
|
||||
tx->platform = client->dev.platform_data;
|
||||
|
||||
#ifdef CONFIG_SIIHDMI_HOTPLUG
|
||||
tx->irq = plat->hotplug_irq;
|
||||
tx->irq = tx->platform->hotplug_irq;
|
||||
|
||||
PREPARE_DELAYED_WORK(&tx->hotplug, siihdmi_hotplug_event);
|
||||
ret = request_irq(tx->irq, siihdmi_irq_handler, IRQF_TRIGGER_RISING, "hdmi_hotplug", (void *) tx);
|
||||
if (ret) {
|
||||
|
||||
if (request_irq(tx->irq, siihdmi_irq_handler,
|
||||
IRQF_TRIGGER_RISING, "hdmi_hotplug", tx) < 0)
|
||||
DEBUG("could not register display hotplug irq\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
i2c_set_clientdata(client, tx);
|
||||
|
||||
#if defined(CONFIG_MACH_MX51_EFIKAMX)
|
||||
msleep(MX51_IPU_SETTLE_TIME_MS);
|
||||
#endif
|
||||
@@ -967,12 +968,14 @@ static int __devinit siihdmi_probe(struct i2c_client *client,
|
||||
if (siihdmi_sink_present(tx)) {
|
||||
/* enable any existing framebuffers */
|
||||
DEBUG("%d registered framebuffers\n", num_registered_fb);
|
||||
for (i = 0; i < num_registered_fb; i++)
|
||||
{
|
||||
/* hack: only init the background framebuffer */
|
||||
if (!strncmp("DISP3 BG", registered_fb[i]->fix.id, 8))
|
||||
if ((ret = siihdmi_init_fb(tx, registered_fb[i])) < 0)
|
||||
goto error;
|
||||
|
||||
for (i = 0; i < num_registered_fb; i++) {
|
||||
if (strcmp(registered_fb[i]->fix.id,
|
||||
tx->platform->framebuffer))
|
||||
continue;
|
||||
|
||||
if ((ret = siihdmi_init_fb(tx, registered_fb[i])) < 0)
|
||||
goto error;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
|
||||
@@ -311,8 +311,25 @@ struct siihdmi_audio_info_frame {
|
||||
struct audio_info_frame info_frame;
|
||||
};
|
||||
|
||||
struct siihdmi_platform_data {
|
||||
/* reset function */
|
||||
void (*reset)(void);
|
||||
|
||||
/* HDMI SPD InfoFrame Data */
|
||||
char *vendor;
|
||||
char *description;
|
||||
|
||||
/* framebuffer fixed id */
|
||||
char *framebuffer;
|
||||
|
||||
/* hotplug IRQ */
|
||||
int hotplug_irq;
|
||||
};
|
||||
|
||||
struct siihdmi_tx {
|
||||
struct i2c_client *client;
|
||||
struct siihdmi_platform_data *platform;
|
||||
|
||||
struct notifier_block nb;
|
||||
struct delayed_work hotplug;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user