aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2013-12-17 06:53:28 -0500
committerTomi Valkeinen <tomi.valkeinen@ti.com>2014-01-13 05:19:54 -0500
commit68104467ec19a56db2799049e53e910089c66c75 (patch)
tree03ce6324fe2da296a9d3e3b13e9312e1bfe24883
parent6873efe167d76f255e66425d2f11d0dbb79dc60b (diff)
OMAPDSS: DSI: split DSI memory map to smaller blocks
DSI contains three separate blocks: protocol engine, PHY and PLL. At the moment, all these are memory mapped in one big chunk. We need to split that memory map into smaller pieces so that we can add proper 'reg' properties into the DT data for each block. This patch changes the driver to map the blocks separately. It first tries to get the memory resource using name, used when booting with DT, and if that fails, it gets the memory resource by ID, in which case the driver gets the big chunk from platform data. That big chunk is then split into the smaller blocks manually. After DSS DT code has been merged and the old platform code removed, we can clean up the memory resource management. Instead of changing the driver in all the places where a register is read or written, this patch takes a shortcut: it adds an additional number to the struct which represents the register index. This number is used to decide which base address to use. In the future we should consider other approaches. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
-rw-r--r--drivers/video/omap2/dss/dsi.c195
1 files changed, 136 insertions, 59 deletions
diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
index 1cd3e47fd43f..f6f8d93c4be9 100644
--- a/drivers/video/omap2/dss/dsi.c
+++ b/drivers/video/omap2/dss/dsi.c
@@ -47,63 +47,73 @@
47 47
48#define DSI_CATCH_MISSING_TE 48#define DSI_CATCH_MISSING_TE
49 49
50struct dsi_reg { u16 idx; }; 50struct dsi_reg { u16 module; u16 idx; };
51 51
52#define DSI_REG(idx) ((const struct dsi_reg) { idx }) 52#define DSI_REG(mod, idx) ((const struct dsi_reg) { mod, idx })
53 53
54#define DSI_SZ_REGS SZ_1K
55/* DSI Protocol Engine */ 54/* DSI Protocol Engine */
56 55
57#define DSI_REVISION DSI_REG(0x0000) 56#define DSI_PROTO 0
58#define DSI_SYSCONFIG DSI_REG(0x0010) 57#define DSI_PROTO_SZ 0x200
59#define DSI_SYSSTATUS DSI_REG(0x0014) 58
60#define DSI_IRQSTATUS DSI_REG(0x0018) 59#define DSI_REVISION DSI_REG(DSI_PROTO, 0x0000)
61#define DSI_IRQENABLE DSI_REG(0x001C) 60#define DSI_SYSCONFIG DSI_REG(DSI_PROTO, 0x0010)
62#define DSI_CTRL DSI_REG(0x0040) 61#define DSI_SYSSTATUS DSI_REG(DSI_PROTO, 0x0014)
63#define DSI_GNQ DSI_REG(0x0044) 62#define DSI_IRQSTATUS DSI_REG(DSI_PROTO, 0x0018)
64#define DSI_COMPLEXIO_CFG1 DSI_REG(0x0048) 63#define DSI_IRQENABLE DSI_REG(DSI_PROTO, 0x001C)
65#define DSI_COMPLEXIO_IRQ_STATUS DSI_REG(0x004C) 64#define DSI_CTRL DSI_REG(DSI_PROTO, 0x0040)
66#define DSI_COMPLEXIO_IRQ_ENABLE DSI_REG(0x0050) 65#define DSI_GNQ DSI_REG(DSI_PROTO, 0x0044)
67#define DSI_CLK_CTRL DSI_REG(0x0054) 66#define DSI_COMPLEXIO_CFG1 DSI_REG(DSI_PROTO, 0x0048)
68#define DSI_TIMING1 DSI_REG(0x0058) 67#define DSI_COMPLEXIO_IRQ_STATUS DSI_REG(DSI_PROTO, 0x004C)
69#define DSI_TIMING2 DSI_REG(0x005C) 68#define DSI_COMPLEXIO_IRQ_ENABLE DSI_REG(DSI_PROTO, 0x0050)
70#define DSI_VM_TIMING1 DSI_REG(0x0060) 69#define DSI_CLK_CTRL DSI_REG(DSI_PROTO, 0x0054)
71#define DSI_VM_TIMING2 DSI_REG(0x0064) 70#define DSI_TIMING1 DSI_REG(DSI_PROTO, 0x0058)
72#define DSI_VM_TIMING3 DSI_REG(0x0068) 71#define DSI_TIMING2 DSI_REG(DSI_PROTO, 0x005C)
73#define DSI_CLK_TIMING DSI_REG(0x006C) 72#define DSI_VM_TIMING1 DSI_REG(DSI_PROTO, 0x0060)
74#define DSI_TX_FIFO_VC_SIZE DSI_REG(0x0070) 73#define DSI_VM_TIMING2 DSI_REG(DSI_PROTO, 0x0064)
75#define DSI_RX_FIFO_VC_SIZE DSI_REG(0x0074) 74#define DSI_VM_TIMING3 DSI_REG(DSI_PROTO, 0x0068)
76#define DSI_COMPLEXIO_CFG2 DSI_REG(0x0078) 75#define DSI_CLK_TIMING DSI_REG(DSI_PROTO, 0x006C)
77#define DSI_RX_FIFO_VC_FULLNESS DSI_REG(0x007C) 76#define DSI_TX_FIFO_VC_SIZE DSI_REG(DSI_PROTO, 0x0070)
78#define DSI_VM_TIMING4 DSI_REG(0x0080) 77#define DSI_RX_FIFO_VC_SIZE DSI_REG(DSI_PROTO, 0x0074)
79#define DSI_TX_FIFO_VC_EMPTINESS DSI_REG(0x0084) 78#define DSI_COMPLEXIO_CFG2 DSI_REG(DSI_PROTO, 0x0078)
80#define DSI_VM_TIMING5 DSI_REG(0x0088) 79#define DSI_RX_FIFO_VC_FULLNESS DSI_REG(DSI_PROTO, 0x007C)
81#define DSI_VM_TIMING6 DSI_REG(0x008C) 80#define DSI_VM_TIMING4 DSI_REG(DSI_PROTO, 0x0080)
82#define DSI_VM_TIMING7 DSI_REG(0x0090) 81#define DSI_TX_FIFO_VC_EMPTINESS DSI_REG(DSI_PROTO, 0x0084)
83#define DSI_STOPCLK_TIMING DSI_REG(0x0094) 82#define DSI_VM_TIMING5 DSI_REG(DSI_PROTO, 0x0088)
84#define DSI_VC_CTRL(n) DSI_REG(0x0100 + (n * 0x20)) 83#define DSI_VM_TIMING6 DSI_REG(DSI_PROTO, 0x008C)
85#define DSI_VC_TE(n) DSI_REG(0x0104 + (n * 0x20)) 84#define DSI_VM_TIMING7 DSI_REG(DSI_PROTO, 0x0090)
86#define DSI_VC_LONG_PACKET_HEADER(n) DSI_REG(0x0108 + (n * 0x20)) 85#define DSI_STOPCLK_TIMING DSI_REG(DSI_PROTO, 0x0094)
87#define DSI_VC_LONG_PACKET_PAYLOAD(n) DSI_REG(0x010C + (n * 0x20)) 86#define DSI_VC_CTRL(n) DSI_REG(DSI_PROTO, 0x0100 + (n * 0x20))
88#define DSI_VC_SHORT_PACKET_HEADER(n) DSI_REG(0x0110 + (n * 0x20)) 87#define DSI_VC_TE(n) DSI_REG(DSI_PROTO, 0x0104 + (n * 0x20))
89#define DSI_VC_IRQSTATUS(n) DSI_REG(0x0118 + (n * 0x20)) 88#define DSI_VC_LONG_PACKET_HEADER(n) DSI_REG(DSI_PROTO, 0x0108 + (n * 0x20))
90#define DSI_VC_IRQENABLE(n) DSI_REG(0x011C + (n * 0x20)) 89#define DSI_VC_LONG_PACKET_PAYLOAD(n) DSI_REG(DSI_PROTO, 0x010C + (n * 0x20))
90#define DSI_VC_SHORT_PACKET_HEADER(n) DSI_REG(DSI_PROTO, 0x0110 + (n * 0x20))
91#define DSI_VC_IRQSTATUS(n) DSI_REG(DSI_PROTO, 0x0118 + (n * 0x20))
92#define DSI_VC_IRQENABLE(n) DSI_REG(DSI_PROTO, 0x011C + (n * 0x20))
91 93
92/* DSIPHY_SCP */ 94/* DSIPHY_SCP */
93 95
94#define DSI_DSIPHY_CFG0 DSI_REG(0x200 + 0x0000) 96#define DSI_PHY 1
95#define DSI_DSIPHY_CFG1 DSI_REG(0x200 + 0x0004) 97#define DSI_PHY_OFFSET 0x200
96#define DSI_DSIPHY_CFG2 DSI_REG(0x200 + 0x0008) 98#define DSI_PHY_SZ 0x40
97#define DSI_DSIPHY_CFG5 DSI_REG(0x200 + 0x0014) 99
98#define DSI_DSIPHY_CFG10 DSI_REG(0x200 + 0x0028) 100#define DSI_DSIPHY_CFG0 DSI_REG(DSI_PHY, 0x0000)
101#define DSI_DSIPHY_CFG1 DSI_REG(DSI_PHY, 0x0004)
102#define DSI_DSIPHY_CFG2 DSI_REG(DSI_PHY, 0x0008)
103#define DSI_DSIPHY_CFG5 DSI_REG(DSI_PHY, 0x0014)
104#define DSI_DSIPHY_CFG10 DSI_REG(DSI_PHY, 0x0028)
99 105
100/* DSI_PLL_CTRL_SCP */ 106/* DSI_PLL_CTRL_SCP */
101 107
102#define DSI_PLL_CONTROL DSI_REG(0x300 + 0x0000) 108#define DSI_PLL 2
103#define DSI_PLL_STATUS DSI_REG(0x300 + 0x0004) 109#define DSI_PLL_OFFSET 0x300
104#define DSI_PLL_GO DSI_REG(0x300 + 0x0008) 110#define DSI_PLL_SZ 0x20
105#define DSI_PLL_CONFIGURATION1 DSI_REG(0x300 + 0x000C) 111
106#define DSI_PLL_CONFIGURATION2 DSI_REG(0x300 + 0x0010) 112#define DSI_PLL_CONTROL DSI_REG(DSI_PLL, 0x0000)
113#define DSI_PLL_STATUS DSI_REG(DSI_PLL, 0x0004)
114#define DSI_PLL_GO DSI_REG(DSI_PLL, 0x0008)
115#define DSI_PLL_CONFIGURATION1 DSI_REG(DSI_PLL, 0x000C)
116#define DSI_PLL_CONFIGURATION2 DSI_REG(DSI_PLL, 0x0010)
107 117
108#define REG_GET(dsidev, idx, start, end) \ 118#define REG_GET(dsidev, idx, start, end) \
109 FLD_GET(dsi_read_reg(dsidev, idx), start, end) 119 FLD_GET(dsi_read_reg(dsidev, idx), start, end)
@@ -277,7 +287,9 @@ struct dsi_clk_calc_ctx {
277 287
278struct dsi_data { 288struct dsi_data {
279 struct platform_device *pdev; 289 struct platform_device *pdev;
280 void __iomem *base; 290 void __iomem *proto_base;
291 void __iomem *phy_base;
292 void __iomem *pll_base;
281 293
282 int module_id; 294 int module_id;
283 295
@@ -414,16 +426,32 @@ static inline void dsi_write_reg(struct platform_device *dsidev,
414 const struct dsi_reg idx, u32 val) 426 const struct dsi_reg idx, u32 val)
415{ 427{
416 struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 428 struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev);
429 void __iomem *base;
430
431 switch(idx.module) {
432 case DSI_PROTO: base = dsi->proto_base; break;
433 case DSI_PHY: base = dsi->phy_base; break;
434 case DSI_PLL: base = dsi->pll_base; break;
435 default: return;
436 }
417 437
418 __raw_writel(val, dsi->base + idx.idx); 438 __raw_writel(val, base + idx.idx);
419} 439}
420 440
421static inline u32 dsi_read_reg(struct platform_device *dsidev, 441static inline u32 dsi_read_reg(struct platform_device *dsidev,
422 const struct dsi_reg idx) 442 const struct dsi_reg idx)
423{ 443{
424 struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 444 struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev);
445 void __iomem *base;
425 446
426 return __raw_readl(dsi->base + idx.idx); 447 switch(idx.module) {
448 case DSI_PROTO: base = dsi->proto_base; break;
449 case DSI_PHY: base = dsi->phy_base; break;
450 case DSI_PLL: base = dsi->pll_base; break;
451 default: return 0;
452 }
453
454 return __raw_readl(base + idx.idx);
427} 455}
428 456
429static void dsi_bus_lock(struct omap_dss_device *dssdev) 457static void dsi_bus_lock(struct omap_dss_device *dssdev)
@@ -5346,8 +5374,9 @@ static int omap_dsihw_probe(struct platform_device *dsidev)
5346{ 5374{
5347 u32 rev; 5375 u32 rev;
5348 int r, i; 5376 int r, i;
5349 struct resource *dsi_mem;
5350 struct dsi_data *dsi; 5377 struct dsi_data *dsi;
5378 struct resource *res;
5379 struct resource temp_res;
5351 5380
5352 dsi = devm_kzalloc(&dsidev->dev, sizeof(*dsi), GFP_KERNEL); 5381 dsi = devm_kzalloc(&dsidev->dev, sizeof(*dsi), GFP_KERNEL);
5353 if (!dsi) 5382 if (!dsi)
@@ -5377,16 +5406,64 @@ static int omap_dsihw_probe(struct platform_device *dsidev)
5377 dsi->te_timer.function = dsi_te_timeout; 5406 dsi->te_timer.function = dsi_te_timeout;
5378 dsi->te_timer.data = 0; 5407 dsi->te_timer.data = 0;
5379#endif 5408#endif
5380 dsi_mem = platform_get_resource(dsi->pdev, IORESOURCE_MEM, 0); 5409
5381 if (!dsi_mem) { 5410 res = platform_get_resource_byname(dsidev, IORESOURCE_MEM, "proto");
5382 DSSERR("can't get IORESOURCE_MEM DSI\n"); 5411 if (!res) {
5383 return -EINVAL; 5412 res = platform_get_resource(dsidev, IORESOURCE_MEM, 0);
5413 if (!res) {
5414 DSSERR("can't get IORESOURCE_MEM DSI\n");
5415 return -EINVAL;
5416 }
5417
5418 temp_res.start = res->start;
5419 temp_res.end = temp_res.start + DSI_PROTO_SZ - 1;
5420 res = &temp_res;
5421 }
5422
5423 dsi->proto_base = devm_ioremap(&dsidev->dev, res->start,
5424 resource_size(res));
5425 if (!dsi->proto_base) {
5426 DSSERR("can't ioremap DSI protocol engine\n");
5427 return -ENOMEM;
5428 }
5429
5430 res = platform_get_resource_byname(dsidev, IORESOURCE_MEM, "phy");
5431 if (!res) {
5432 res = platform_get_resource(dsidev, IORESOURCE_MEM, 0);
5433 if (!res) {
5434 DSSERR("can't get IORESOURCE_MEM DSI\n");
5435 return -EINVAL;
5436 }
5437
5438 temp_res.start = res->start + DSI_PHY_OFFSET;
5439 temp_res.end = temp_res.start + DSI_PHY_SZ - 1;
5440 res = &temp_res;
5441 }
5442
5443 dsi->phy_base = devm_ioremap(&dsidev->dev, res->start,
5444 resource_size(res));
5445 if (!dsi->proto_base) {
5446 DSSERR("can't ioremap DSI PHY\n");
5447 return -ENOMEM;
5448 }
5449
5450 res = platform_get_resource_byname(dsidev, IORESOURCE_MEM, "pll");
5451 if (!res) {
5452 res = platform_get_resource(dsidev, IORESOURCE_MEM, 0);
5453 if (!res) {
5454 DSSERR("can't get IORESOURCE_MEM DSI\n");
5455 return -EINVAL;
5456 }
5457
5458 temp_res.start = res->start + DSI_PLL_OFFSET;
5459 temp_res.end = temp_res.start + DSI_PLL_SZ - 1;
5460 res = &temp_res;
5384 } 5461 }
5385 5462
5386 dsi->base = devm_ioremap(&dsidev->dev, dsi_mem->start, 5463 dsi->pll_base = devm_ioremap(&dsidev->dev, res->start,
5387 resource_size(dsi_mem)); 5464 resource_size(res));
5388 if (!dsi->base) { 5465 if (!dsi->proto_base) {
5389 DSSERR("can't ioremap DSI\n"); 5466 DSSERR("can't ioremap DSI PLL\n");
5390 return -ENOMEM; 5467 return -ENOMEM;
5391 } 5468 }
5392 5469