aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/mfd/tc6393xb.c87
-rw-r--r--include/linux/mfd/tc6393xb.h1
2 files changed, 88 insertions, 0 deletions
diff --git a/drivers/mfd/tc6393xb.c b/drivers/mfd/tc6393xb.c
index c3c64aeeb12a..6197db7d4859 100644
--- a/drivers/mfd/tc6393xb.c
+++ b/drivers/mfd/tc6393xb.c
@@ -113,6 +113,7 @@ struct tc6393xb {
113enum { 113enum {
114 TC6393XB_CELL_NAND, 114 TC6393XB_CELL_NAND,
115 TC6393XB_CELL_MMC, 115 TC6393XB_CELL_MMC,
116 TC6393XB_CELL_OHCI,
116}; 117};
117 118
118/*--------------------------------------------------------------------------*/ 119/*--------------------------------------------------------------------------*/
@@ -170,6 +171,78 @@ static struct resource __devinitdata tc6393xb_mmc_resources[] = {
170 }, 171 },
171}; 172};
172 173
174const static struct resource tc6393xb_ohci_resources[] = {
175 {
176 .start = 0x3000,
177 .end = 0x31ff,
178 .flags = IORESOURCE_MEM,
179 },
180 {
181 .start = 0x0300,
182 .end = 0x03ff,
183 .flags = IORESOURCE_MEM,
184 },
185 {
186 .start = 0x010000,
187 .end = 0x017fff,
188 .flags = IORESOURCE_MEM,
189 },
190 {
191 .start = 0x018000,
192 .end = 0x01ffff,
193 .flags = IORESOURCE_MEM,
194 },
195 {
196 .start = IRQ_TC6393_OHCI,
197 .end = IRQ_TC6393_OHCI,
198 .flags = IORESOURCE_IRQ,
199 },
200};
201
202static int tc6393xb_ohci_enable(struct platform_device *dev)
203{
204 struct tc6393xb *tc6393xb = dev_get_drvdata(dev->dev.parent);
205 unsigned long flags;
206 u16 ccr;
207 u8 fer;
208
209 spin_lock_irqsave(&tc6393xb->lock, flags);
210
211 ccr = tmio_ioread16(tc6393xb->scr + SCR_CCR);
212 ccr |= SCR_CCR_USBCK;
213 tmio_iowrite16(ccr, tc6393xb->scr + SCR_CCR);
214
215 fer = tmio_ioread8(tc6393xb->scr + SCR_FER);
216 fer |= SCR_FER_USBEN;
217 tmio_iowrite8(fer, tc6393xb->scr + SCR_FER);
218
219 spin_unlock_irqrestore(&tc6393xb->lock, flags);
220
221 return 0;
222}
223
224static int tc6393xb_ohci_disable(struct platform_device *dev)
225{
226 struct tc6393xb *tc6393xb = dev_get_drvdata(dev->dev.parent);
227 unsigned long flags;
228 u16 ccr;
229 u8 fer;
230
231 spin_lock_irqsave(&tc6393xb->lock, flags);
232
233 fer = tmio_ioread8(tc6393xb->scr + SCR_FER);
234 fer &= ~SCR_FER_USBEN;
235 tmio_iowrite8(fer, tc6393xb->scr + SCR_FER);
236
237 ccr = tmio_ioread16(tc6393xb->scr + SCR_CCR);
238 ccr &= ~SCR_CCR_USBCK;
239 tmio_iowrite16(ccr, tc6393xb->scr + SCR_CCR);
240
241 spin_unlock_irqrestore(&tc6393xb->lock, flags);
242
243 return 0;
244}
245
173static struct mfd_cell __devinitdata tc6393xb_cells[] = { 246static struct mfd_cell __devinitdata tc6393xb_cells[] = {
174 [TC6393XB_CELL_NAND] = { 247 [TC6393XB_CELL_NAND] = {
175 .name = "tmio-nand", 248 .name = "tmio-nand",
@@ -182,6 +255,15 @@ static struct mfd_cell __devinitdata tc6393xb_cells[] = {
182 .num_resources = ARRAY_SIZE(tc6393xb_mmc_resources), 255 .num_resources = ARRAY_SIZE(tc6393xb_mmc_resources),
183 .resources = tc6393xb_mmc_resources, 256 .resources = tc6393xb_mmc_resources,
184 }, 257 },
258 [TC6393XB_CELL_OHCI] = {
259 .name = "tmio-ohci",
260 .num_resources = ARRAY_SIZE(tc6393xb_ohci_resources),
261 .resources = tc6393xb_ohci_resources,
262 .enable = tc6393xb_ohci_enable,
263 .suspend = tc6393xb_ohci_disable,
264 .resume = tc6393xb_ohci_enable,
265 .disable = tc6393xb_ohci_disable,
266 },
185}; 267};
186 268
187/*--------------------------------------------------------------------------*/ 269/*--------------------------------------------------------------------------*/
@@ -470,6 +552,11 @@ static int __devinit tc6393xb_probe(struct platform_device *dev)
470 tc6393xb_cells[TC6393XB_CELL_MMC].data_size = 552 tc6393xb_cells[TC6393XB_CELL_MMC].data_size =
471 sizeof(tc6393xb_cells[TC6393XB_CELL_MMC]); 553 sizeof(tc6393xb_cells[TC6393XB_CELL_MMC]);
472 554
555 tc6393xb_cells[TC6393XB_CELL_OHCI].platform_data =
556 &tc6393xb_cells[TC6393XB_CELL_OHCI];
557 tc6393xb_cells[TC6393XB_CELL_OHCI].data_size =
558 sizeof(tc6393xb_cells[TC6393XB_CELL_OHCI]);
559
473 560
474 ret = mfd_add_devices(&dev->dev, dev->id, 561 ret = mfd_add_devices(&dev->dev, dev->id,
475 tc6393xb_cells, ARRAY_SIZE(tc6393xb_cells), 562 tc6393xb_cells, ARRAY_SIZE(tc6393xb_cells),
diff --git a/include/linux/mfd/tc6393xb.h b/include/linux/mfd/tc6393xb.h
index 3ce10ae0f397..4437736ebe19 100644
--- a/include/linux/mfd/tc6393xb.h
+++ b/include/linux/mfd/tc6393xb.h
@@ -44,6 +44,7 @@ struct tc6393xb_platform_data {
44 */ 44 */
45#define IRQ_TC6393_NAND 0 45#define IRQ_TC6393_NAND 0
46#define IRQ_TC6393_MMC 1 46#define IRQ_TC6393_MMC 1
47#define IRQ_TC6393_OHCI 2
47 48
48#define TC6393XB_NR_IRQS 8 49#define TC6393XB_NR_IRQS 8
49 50