diff options
author | Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | 2012-05-08 06:07:49 +0200 |
---|---|---|
committer | Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | 2012-05-13 15:07:59 +0200 |
commit | db6668d83a265a15ffd79dbc8432598808b34bb4 (patch) | |
tree | 7e0b6aaf31ee2799c6ae8acf074c917591c5de90 | |
parent | fbdev: sh_mobile_hdmi: add interrupt output option (diff) | |
download | linux-db6668d83a265a15ffd79dbc8432598808b34bb4.tar.xz linux-db6668d83a265a15ffd79dbc8432598808b34bb4.zip |
fbdev: sh_mobile_hdmi: 32bit register access support
Latest SuperH HDMI allows 32bit access only.
But the data is 8bit. So, we can keep compatibility by switching 8/32 bit access.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
-rw-r--r-- | drivers/video/sh_mobile_hdmi.c | 38 | ||||
-rw-r--r-- | include/video/sh_mobile_hdmi.h | 5 |
2 files changed, 40 insertions, 3 deletions
diff --git a/drivers/video/sh_mobile_hdmi.c b/drivers/video/sh_mobile_hdmi.c index 0bc39bc976a8..4d48a805dfe1 100644 --- a/drivers/video/sh_mobile_hdmi.c +++ b/drivers/video/sh_mobile_hdmi.c @@ -222,20 +222,45 @@ struct sh_hdmi { struct delayed_work edid_work; struct fb_videomode mode; struct fb_monspecs monspec; + + /* register access functions */ + void (*write)(struct sh_hdmi *hdmi, u8 data, u8 reg); + u8 (*read)(struct sh_hdmi *hdmi, u8 reg); }; #define entity_to_sh_hdmi(e) container_of(e, struct sh_hdmi, entity) -static void hdmi_write(struct sh_hdmi *hdmi, u8 data, u8 reg) +static void __hdmi_write8(struct sh_hdmi *hdmi, u8 data, u8 reg) { iowrite8(data, hdmi->base + reg); } -static u8 hdmi_read(struct sh_hdmi *hdmi, u8 reg) +static u8 __hdmi_read8(struct sh_hdmi *hdmi, u8 reg) { return ioread8(hdmi->base + reg); } +static void __hdmi_write32(struct sh_hdmi *hdmi, u8 data, u8 reg) +{ + iowrite32((u32)data, hdmi->base + (reg * 4)); + udelay(100); +} + +static u8 __hdmi_read32(struct sh_hdmi *hdmi, u8 reg) +{ + return (u8)ioread32(hdmi->base + (reg * 4)); +} + +static void hdmi_write(struct sh_hdmi *hdmi, u8 data, u8 reg) +{ + hdmi->write(hdmi, data, reg); +} + +static u8 hdmi_read(struct sh_hdmi *hdmi, u8 reg) +{ + return hdmi->read(hdmi, reg); +} + static void hdmi_bit_set(struct sh_hdmi *hdmi, u8 mask, u8 data, u8 reg) { u8 val = hdmi_read(hdmi, reg); @@ -1148,6 +1173,15 @@ static int __init sh_hdmi_probe(struct platform_device *pdev) goto egetclk; } + /* select register access functions */ + if (pdata->flags & HDMI_32BIT_REG) { + hdmi->write = __hdmi_write32; + hdmi->read = __hdmi_read32; + } else { + hdmi->write = __hdmi_write8; + hdmi->read = __hdmi_read8; + } + /* An arbitrary relaxed pixclock just to get things started: from standard 480p */ rate = clk_round_rate(hdmi->hdmi_clk, PICOS2KHZ(37037)); if (rate > 0) diff --git a/include/video/sh_mobile_hdmi.h b/include/video/sh_mobile_hdmi.h index 2699635a99ef..ce8a540996c7 100644 --- a/include/video/sh_mobile_hdmi.h +++ b/include/video/sh_mobile_hdmi.h @@ -18,10 +18,11 @@ struct clk; /* * flags format * - * 0x000000BA + * 0x00000CBA * * A: Audio source select * B: Int output option + * C: Chip specific option */ /* Audio source select */ @@ -35,6 +36,8 @@ struct clk; #define HDMI_OUTPUT_PUSH_PULL (1 << 4) /* System control : output mode */ #define HDMI_OUTPUT_POLARITY_HI (1 << 5) /* System control : output polarity */ +/* Chip specific option */ +#define HDMI_32BIT_REG (1 << 8) struct sh_mobile_hdmi_info { unsigned int flags; |