~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to arch/arm/common/locomo.c

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * linux/arch/arm/common/locomo.c
 
3
 *
 
4
 * Sharp LoCoMo support
 
5
 *
 
6
 * This program is free software; you can redistribute it and/or modify
 
7
 * it under the terms of the GNU General Public License version 2 as
 
8
 * published by the Free Software Foundation.
 
9
 *
 
10
 * This file contains all generic LoCoMo support.
 
11
 *
 
12
 * All initialization functions provided here are intended to be called
 
13
 * from machine specific code with proper arguments when required.
 
14
 *
 
15
 * Based on sa1111.c
 
16
 */
 
17
 
 
18
#include <linux/module.h>
 
19
#include <linux/init.h>
 
20
#include <linux/kernel.h>
 
21
#include <linux/delay.h>
 
22
#include <linux/errno.h>
 
23
#include <linux/ioport.h>
 
24
#include <linux/platform_device.h>
 
25
#include <linux/slab.h>
 
26
#include <linux/spinlock.h>
 
27
#include <linux/io.h>
 
28
 
 
29
#include <mach/hardware.h>
 
30
#include <asm/irq.h>
 
31
#include <asm/mach/irq.h>
 
32
 
 
33
#include <asm/hardware/locomo.h>
 
34
 
 
35
/* LoCoMo Interrupts */
 
36
#define IRQ_LOCOMO_KEY          (0)
 
37
#define IRQ_LOCOMO_GPIO         (1)
 
38
#define IRQ_LOCOMO_LT           (2)
 
39
#define IRQ_LOCOMO_SPI          (3)
 
40
 
 
41
/* M62332 output channel selection */
 
42
#define M62332_EVR_CH   1       /* M62332 volume channel number  */
 
43
                                /*   0 : CH.1 , 1 : CH. 2        */
 
44
/* DAC send data */
 
45
#define M62332_SLAVE_ADDR       0x4e    /* Slave address  */
 
46
#define M62332_W_BIT            0x00    /* W bit (0 only) */
 
47
#define M62332_SUB_ADDR         0x00    /* Sub address    */
 
48
#define M62332_A_BIT            0x00    /* A bit (0 only) */
 
49
 
 
50
/* DAC setup and hold times (expressed in us) */
 
51
#define DAC_BUS_FREE_TIME       5       /*   4.7 us */
 
52
#define DAC_START_SETUP_TIME    5       /*   4.7 us */
 
53
#define DAC_STOP_SETUP_TIME     4       /*   4.0 us */
 
54
#define DAC_START_HOLD_TIME     5       /*   4.7 us */
 
55
#define DAC_SCL_LOW_HOLD_TIME   5       /*   4.7 us */
 
56
#define DAC_SCL_HIGH_HOLD_TIME  4       /*   4.0 us */
 
57
#define DAC_DATA_SETUP_TIME     1       /*   250 ns */
 
58
#define DAC_DATA_HOLD_TIME      1       /*   300 ns */
 
59
#define DAC_LOW_SETUP_TIME      1       /*   300 ns */
 
60
#define DAC_HIGH_SETUP_TIME     1       /*  1000 ns */
 
61
 
 
62
/* the following is the overall data for the locomo chip */
 
63
struct locomo {
 
64
        struct device *dev;
 
65
        unsigned long phys;
 
66
        unsigned int irq;
 
67
        int irq_base;
 
68
        spinlock_t lock;
 
69
        void __iomem *base;
 
70
#ifdef CONFIG_PM
 
71
        void *saved_state;
 
72
#endif
 
73
};
 
74
 
 
75
struct locomo_dev_info {
 
76
        unsigned long   offset;
 
77
        unsigned long   length;
 
78
        unsigned int    devid;
 
79
        unsigned int    irq[1];
 
80
        const char *    name;
 
81
};
 
82
 
 
83
/* All the locomo devices.  If offset is non-zero, the mapbase for the
 
84
 * locomo_dev will be set to the chip base plus offset.  If offset is
 
85
 * zero, then the mapbase for the locomo_dev will be set to zero.  An
 
86
 * offset of zero means the device only uses GPIOs or other helper
 
87
 * functions inside this file */
 
88
static struct locomo_dev_info locomo_devices[] = {
 
89
        {
 
90
                .devid          = LOCOMO_DEVID_KEYBOARD,
 
91
                .irq            = { IRQ_LOCOMO_KEY },
 
92
                .name           = "locomo-keyboard",
 
93
                .offset         = LOCOMO_KEYBOARD,
 
94
                .length         = 16,
 
95
        },
 
96
        {
 
97
                .devid          = LOCOMO_DEVID_FRONTLIGHT,
 
98
                .irq            = {},
 
99
                .name           = "locomo-frontlight",
 
100
                .offset         = LOCOMO_FRONTLIGHT,
 
101
                .length         = 8,
 
102
 
 
103
        },
 
104
        {
 
105
                .devid          = LOCOMO_DEVID_BACKLIGHT,
 
106
                .irq            = {},
 
107
                .name           = "locomo-backlight",
 
108
                .offset         = LOCOMO_BACKLIGHT,
 
109
                .length         = 8,
 
110
        },
 
111
        {
 
112
                .devid          = LOCOMO_DEVID_AUDIO,
 
113
                .irq            = {},
 
114
                .name           = "locomo-audio",
 
115
                .offset         = LOCOMO_AUDIO,
 
116
                .length         = 4,
 
117
        },
 
118
        {
 
119
                .devid          = LOCOMO_DEVID_LED,
 
120
                .irq            = {},
 
121
                .name           = "locomo-led",
 
122
                .offset         = LOCOMO_LED,
 
123
                .length         = 8,
 
124
        },
 
125
        {
 
126
                .devid          = LOCOMO_DEVID_UART,
 
127
                .irq            = {},
 
128
                .name           = "locomo-uart",
 
129
                .offset         = 0,
 
130
                .length         = 0,
 
131
        },
 
132
        {
 
133
                .devid          = LOCOMO_DEVID_SPI,
 
134
                .irq            = {},
 
135
                .name           = "locomo-spi",
 
136
                .offset         = LOCOMO_SPI,
 
137
                .length         = 0x30,
 
138
        },
 
139
};
 
140
 
 
141
static void locomo_handler(unsigned int irq, struct irq_desc *desc)
 
142
{
 
143
        struct locomo *lchip = irq_get_chip_data(irq);
 
144
        int req, i;
 
145
 
 
146
        /* Acknowledge the parent IRQ */
 
147
        desc->irq_data.chip->irq_ack(&desc->irq_data);
 
148
 
 
149
        /* check why this interrupt was generated */
 
150
        req = locomo_readl(lchip->base + LOCOMO_ICR) & 0x0f00;
 
151
 
 
152
        if (req) {
 
153
                /* generate the next interrupt(s) */
 
154
                irq = lchip->irq_base;
 
155
                for (i = 0; i <= 3; i++, irq++) {
 
156
                        if (req & (0x0100 << i)) {
 
157
                                generic_handle_irq(irq);
 
158
                        }
 
159
 
 
160
                }
 
161
        }
 
162
}
 
163
 
 
164
static void locomo_ack_irq(struct irq_data *d)
 
165
{
 
166
}
 
167
 
 
168
static void locomo_mask_irq(struct irq_data *d)
 
169
{
 
170
        struct locomo *lchip = irq_data_get_irq_chip_data(d);
 
171
        unsigned int r;
 
172
        r = locomo_readl(lchip->base + LOCOMO_ICR);
 
173
        r &= ~(0x0010 << (d->irq - lchip->irq_base));
 
174
        locomo_writel(r, lchip->base + LOCOMO_ICR);
 
175
}
 
176
 
 
177
static void locomo_unmask_irq(struct irq_data *d)
 
178
{
 
179
        struct locomo *lchip = irq_data_get_irq_chip_data(d);
 
180
        unsigned int r;
 
181
        r = locomo_readl(lchip->base + LOCOMO_ICR);
 
182
        r |= (0x0010 << (d->irq - lchip->irq_base));
 
183
        locomo_writel(r, lchip->base + LOCOMO_ICR);
 
184
}
 
185
 
 
186
static struct irq_chip locomo_chip = {
 
187
        .name           = "LOCOMO",
 
188
        .irq_ack        = locomo_ack_irq,
 
189
        .irq_mask       = locomo_mask_irq,
 
190
        .irq_unmask     = locomo_unmask_irq,
 
191
};
 
192
 
 
193
static void locomo_setup_irq(struct locomo *lchip)
 
194
{
 
195
        int irq = lchip->irq_base;
 
196
 
 
197
        /*
 
198
         * Install handler for IRQ_LOCOMO_HW.
 
199
         */
 
200
        irq_set_irq_type(lchip->irq, IRQ_TYPE_EDGE_FALLING);
 
201
        irq_set_chip_data(lchip->irq, lchip);
 
202
        irq_set_chained_handler(lchip->irq, locomo_handler);
 
203
 
 
204
        /* Install handlers for IRQ_LOCOMO_* */
 
205
        for ( ; irq <= lchip->irq_base + 3; irq++) {
 
206
                irq_set_chip_and_handler(irq, &locomo_chip, handle_level_irq);
 
207
                irq_set_chip_data(irq, lchip);
 
208
                set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
 
209
        }
 
210
}
 
211
 
 
212
 
 
213
static void locomo_dev_release(struct device *_dev)
 
214
{
 
215
        struct locomo_dev *dev = LOCOMO_DEV(_dev);
 
216
 
 
217
        kfree(dev);
 
218
}
 
219
 
 
220
static int
 
221
locomo_init_one_child(struct locomo *lchip, struct locomo_dev_info *info)
 
222
{
 
223
        struct locomo_dev *dev;
 
224
        int ret;
 
225
 
 
226
        dev = kzalloc(sizeof(struct locomo_dev), GFP_KERNEL);
 
227
        if (!dev) {
 
228
                ret = -ENOMEM;
 
229
                goto out;
 
230
        }
 
231
 
 
232
        /*
 
233
         * If the parent device has a DMA mask associated with it,
 
234
         * propagate it down to the children.
 
235
         */
 
236
        if (lchip->dev->dma_mask) {
 
237
                dev->dma_mask = *lchip->dev->dma_mask;
 
238
                dev->dev.dma_mask = &dev->dma_mask;
 
239
        }
 
240
 
 
241
        dev_set_name(&dev->dev, "%s", info->name);
 
242
        dev->devid       = info->devid;
 
243
        dev->dev.parent  = lchip->dev;
 
244
        dev->dev.bus     = &locomo_bus_type;
 
245
        dev->dev.release = locomo_dev_release;
 
246
        dev->dev.coherent_dma_mask = lchip->dev->coherent_dma_mask;
 
247
 
 
248
        if (info->offset)
 
249
                dev->mapbase = lchip->base + info->offset;
 
250
        else
 
251
                dev->mapbase = 0;
 
252
        dev->length = info->length;
 
253
 
 
254
        dev->irq[0] = (lchip->irq_base == NO_IRQ) ?
 
255
                        NO_IRQ : lchip->irq_base + info->irq[0];
 
256
 
 
257
        ret = device_register(&dev->dev);
 
258
        if (ret) {
 
259
 out:
 
260
                kfree(dev);
 
261
        }
 
262
        return ret;
 
263
}
 
264
 
 
265
#ifdef CONFIG_PM
 
266
 
 
267
struct locomo_save_data {
 
268
        u16     LCM_GPO;
 
269
        u16     LCM_SPICT;
 
270
        u16     LCM_GPE;
 
271
        u16     LCM_ASD;
 
272
        u16     LCM_SPIMD;
 
273
};
 
274
 
 
275
static int locomo_suspend(struct platform_device *dev, pm_message_t state)
 
276
{
 
277
        struct locomo *lchip = platform_get_drvdata(dev);
 
278
        struct locomo_save_data *save;
 
279
        unsigned long flags;
 
280
 
 
281
        save = kmalloc(sizeof(struct locomo_save_data), GFP_KERNEL);
 
282
        if (!save)
 
283
                return -ENOMEM;
 
284
 
 
285
        lchip->saved_state = save;
 
286
 
 
287
        spin_lock_irqsave(&lchip->lock, flags);
 
288
 
 
289
        save->LCM_GPO     = locomo_readl(lchip->base + LOCOMO_GPO);     /* GPIO */
 
290
        locomo_writel(0x00, lchip->base + LOCOMO_GPO);
 
291
        save->LCM_SPICT   = locomo_readl(lchip->base + LOCOMO_SPI + LOCOMO_SPICT);      /* SPI */
 
292
        locomo_writel(0x40, lchip->base + LOCOMO_SPI + LOCOMO_SPICT);
 
293
        save->LCM_GPE     = locomo_readl(lchip->base + LOCOMO_GPE);     /* GPIO */
 
294
        locomo_writel(0x00, lchip->base + LOCOMO_GPE);
 
295
        save->LCM_ASD     = locomo_readl(lchip->base + LOCOMO_ASD);     /* ADSTART */
 
296
        locomo_writel(0x00, lchip->base + LOCOMO_ASD);
 
297
        save->LCM_SPIMD   = locomo_readl(lchip->base + LOCOMO_SPI + LOCOMO_SPIMD);      /* SPI */
 
298
        locomo_writel(0x3C14, lchip->base + LOCOMO_SPI + LOCOMO_SPIMD);
 
299
 
 
300
        locomo_writel(0x00, lchip->base + LOCOMO_PAIF);
 
301
        locomo_writel(0x00, lchip->base + LOCOMO_DAC);
 
302
        locomo_writel(0x00, lchip->base + LOCOMO_BACKLIGHT + LOCOMO_TC);
 
303
 
 
304
        if ((locomo_readl(lchip->base + LOCOMO_LED + LOCOMO_LPT0) & 0x88) && (locomo_readl(lchip->base + LOCOMO_LED + LOCOMO_LPT1) & 0x88))
 
305
                locomo_writel(0x00, lchip->base + LOCOMO_C32K);         /* CLK32 off */
 
306
        else
 
307
                /* 18MHz already enabled, so no wait */
 
308
                locomo_writel(0xc1, lchip->base + LOCOMO_C32K);         /* CLK32 on */
 
309
 
 
310
        locomo_writel(0x00, lchip->base + LOCOMO_TADC);         /* 18MHz clock off*/
 
311
        locomo_writel(0x00, lchip->base + LOCOMO_AUDIO + LOCOMO_ACC);                   /* 22MHz/24MHz clock off */
 
312
        locomo_writel(0x00, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALS);                      /* FL */
 
313
 
 
314
        spin_unlock_irqrestore(&lchip->lock, flags);
 
315
 
 
316
        return 0;
 
317
}
 
318
 
 
319
static int locomo_resume(struct platform_device *dev)
 
320
{
 
321
        struct locomo *lchip = platform_get_drvdata(dev);
 
322
        struct locomo_save_data *save;
 
323
        unsigned long r;
 
324
        unsigned long flags;
 
325
 
 
326
        save = lchip->saved_state;
 
327
        if (!save)
 
328
                return 0;
 
329
 
 
330
        spin_lock_irqsave(&lchip->lock, flags);
 
331
 
 
332
        locomo_writel(save->LCM_GPO, lchip->base + LOCOMO_GPO);
 
333
        locomo_writel(save->LCM_SPICT, lchip->base + LOCOMO_SPI + LOCOMO_SPICT);
 
334
        locomo_writel(save->LCM_GPE, lchip->base + LOCOMO_GPE);
 
335
        locomo_writel(save->LCM_ASD, lchip->base + LOCOMO_ASD);
 
336
        locomo_writel(save->LCM_SPIMD, lchip->base + LOCOMO_SPI + LOCOMO_SPIMD);
 
337
 
 
338
        locomo_writel(0x00, lchip->base + LOCOMO_C32K);
 
339
        locomo_writel(0x90, lchip->base + LOCOMO_TADC);
 
340
 
 
341
        locomo_writel(0, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KSC);
 
342
        r = locomo_readl(lchip->base + LOCOMO_KEYBOARD + LOCOMO_KIC);
 
343
        r &= 0xFEFF;
 
344
        locomo_writel(r, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KIC);
 
345
        locomo_writel(0x1, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KCMD);
 
346
 
 
347
        spin_unlock_irqrestore(&lchip->lock, flags);
 
348
 
 
349
        lchip->saved_state = NULL;
 
350
        kfree(save);
 
351
 
 
352
        return 0;
 
353
}
 
354
#endif
 
355
 
 
356
 
 
357
/**
 
358
 *      locomo_probe - probe for a single LoCoMo chip.
 
359
 *      @phys_addr: physical address of device.
 
360
 *
 
361
 *      Probe for a LoCoMo chip.  This must be called
 
362
 *      before any other locomo-specific code.
 
363
 *
 
364
 *      Returns:
 
365
 *      %-ENODEV        device not found.
 
366
 *      %-EBUSY         physical address already marked in-use.
 
367
 *      %0              successful.
 
368
 */
 
369
static int
 
370
__locomo_probe(struct device *me, struct resource *mem, int irq)
 
371
{
 
372
        struct locomo_platform_data *pdata = me->platform_data;
 
373
        struct locomo *lchip;
 
374
        unsigned long r;
 
375
        int i, ret = -ENODEV;
 
376
 
 
377
        lchip = kzalloc(sizeof(struct locomo), GFP_KERNEL);
 
378
        if (!lchip)
 
379
                return -ENOMEM;
 
380
 
 
381
        spin_lock_init(&lchip->lock);
 
382
 
 
383
        lchip->dev = me;
 
384
        dev_set_drvdata(lchip->dev, lchip);
 
385
 
 
386
        lchip->phys = mem->start;
 
387
        lchip->irq = irq;
 
388
        lchip->irq_base = (pdata) ? pdata->irq_base : NO_IRQ;
 
389
 
 
390
        /*
 
391
         * Map the whole region.  This also maps the
 
392
         * registers for our children.
 
393
         */
 
394
        lchip->base = ioremap(mem->start, PAGE_SIZE);
 
395
        if (!lchip->base) {
 
396
                ret = -ENOMEM;
 
397
                goto out;
 
398
        }
 
399
 
 
400
        /* locomo initialize */
 
401
        locomo_writel(0, lchip->base + LOCOMO_ICR);
 
402
        /* KEYBOARD */
 
403
        locomo_writel(0, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KIC);
 
404
 
 
405
        /* GPIO */
 
406
        locomo_writel(0, lchip->base + LOCOMO_GPO);
 
407
        locomo_writel((LOCOMO_GPIO(1) | LOCOMO_GPIO(2) | LOCOMO_GPIO(13) | LOCOMO_GPIO(14))
 
408
                        , lchip->base + LOCOMO_GPE);
 
409
        locomo_writel((LOCOMO_GPIO(1) | LOCOMO_GPIO(2) | LOCOMO_GPIO(13) | LOCOMO_GPIO(14))
 
410
                        , lchip->base + LOCOMO_GPD);
 
411
        locomo_writel(0, lchip->base + LOCOMO_GIE);
 
412
 
 
413
        /* Frontlight */
 
414
        locomo_writel(0, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALS);
 
415
        locomo_writel(0, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALD);
 
416
 
 
417
        /* Longtime timer */
 
418
        locomo_writel(0, lchip->base + LOCOMO_LTINT);
 
419
        /* SPI */
 
420
        locomo_writel(0, lchip->base + LOCOMO_SPI + LOCOMO_SPIIE);
 
421
 
 
422
        locomo_writel(6 + 8 + 320 + 30 - 10, lchip->base + LOCOMO_ASD);
 
423
        r = locomo_readl(lchip->base + LOCOMO_ASD);
 
424
        r |= 0x8000;
 
425
        locomo_writel(r, lchip->base + LOCOMO_ASD);
 
426
 
 
427
        locomo_writel(6 + 8 + 320 + 30 - 10 - 128 + 4, lchip->base + LOCOMO_HSD);
 
428
        r = locomo_readl(lchip->base + LOCOMO_HSD);
 
429
        r |= 0x8000;
 
430
        locomo_writel(r, lchip->base + LOCOMO_HSD);
 
431
 
 
432
        locomo_writel(128 / 8, lchip->base + LOCOMO_HSC);
 
433
 
 
434
        /* XON */
 
435
        locomo_writel(0x80, lchip->base + LOCOMO_TADC);
 
436
        udelay(1000);
 
437
        /* CLK9MEN */
 
438
        r = locomo_readl(lchip->base + LOCOMO_TADC);
 
439
        r |= 0x10;
 
440
        locomo_writel(r, lchip->base + LOCOMO_TADC);
 
441
        udelay(100);
 
442
 
 
443
        /* init DAC */
 
444
        r = locomo_readl(lchip->base + LOCOMO_DAC);
 
445
        r |= LOCOMO_DAC_SCLOEB | LOCOMO_DAC_SDAOEB;
 
446
        locomo_writel(r, lchip->base + LOCOMO_DAC);
 
447
 
 
448
        r = locomo_readl(lchip->base + LOCOMO_VER);
 
449
        printk(KERN_INFO "LoCoMo Chip: %lu%lu\n", (r >> 8), (r & 0xff));
 
450
 
 
451
        /*
 
452
         * The interrupt controller must be initialised before any
 
453
         * other device to ensure that the interrupts are available.
 
454
         */
 
455
        if (lchip->irq != NO_IRQ && lchip->irq_base != NO_IRQ)
 
456
                locomo_setup_irq(lchip);
 
457
 
 
458
        for (i = 0; i < ARRAY_SIZE(locomo_devices); i++)
 
459
                locomo_init_one_child(lchip, &locomo_devices[i]);
 
460
        return 0;
 
461
 
 
462
 out:
 
463
        kfree(lchip);
 
464
        return ret;
 
465
}
 
466
 
 
467
static int locomo_remove_child(struct device *dev, void *data)
 
468
{
 
469
        device_unregister(dev);
 
470
        return 0;
 
471
 
472
 
 
473
static void __locomo_remove(struct locomo *lchip)
 
474
{
 
475
        device_for_each_child(lchip->dev, NULL, locomo_remove_child);
 
476
 
 
477
        if (lchip->irq != NO_IRQ) {
 
478
                irq_set_chained_handler(lchip->irq, NULL);
 
479
                irq_set_handler_data(lchip->irq, NULL);
 
480
        }
 
481
 
 
482
        iounmap(lchip->base);
 
483
        kfree(lchip);
 
484
}
 
485
 
 
486
static int locomo_probe(struct platform_device *dev)
 
487
{
 
488
        struct resource *mem;
 
489
        int irq;
 
490
 
 
491
        mem = platform_get_resource(dev, IORESOURCE_MEM, 0);
 
492
        if (!mem)
 
493
                return -EINVAL;
 
494
        irq = platform_get_irq(dev, 0);
 
495
        if (irq < 0)
 
496
                return -ENXIO;
 
497
 
 
498
        return __locomo_probe(&dev->dev, mem, irq);
 
499
}
 
500
 
 
501
static int locomo_remove(struct platform_device *dev)
 
502
{
 
503
        struct locomo *lchip = platform_get_drvdata(dev);
 
504
 
 
505
        if (lchip) {
 
506
                __locomo_remove(lchip);
 
507
                platform_set_drvdata(dev, NULL);
 
508
        }
 
509
 
 
510
        return 0;
 
511
}
 
512
 
 
513
/*
 
514
 *      Not sure if this should be on the system bus or not yet.
 
515
 *      We really want some way to register a system device at
 
516
 *      the per-machine level, and then have this driver pick
 
517
 *      up the registered devices.
 
518
 */
 
519
static struct platform_driver locomo_device_driver = {
 
520
        .probe          = locomo_probe,
 
521
        .remove         = locomo_remove,
 
522
#ifdef CONFIG_PM
 
523
        .suspend        = locomo_suspend,
 
524
        .resume         = locomo_resume,
 
525
#endif
 
526
        .driver         = {
 
527
                .name   = "locomo",
 
528
        },
 
529
};
 
530
 
 
531
/*
 
532
 *      Get the parent device driver (us) structure
 
533
 *      from a child function device
 
534
 */
 
535
static inline struct locomo *locomo_chip_driver(struct locomo_dev *ldev)
 
536
{
 
537
        return (struct locomo *)dev_get_drvdata(ldev->dev.parent);
 
538
}
 
539
 
 
540
void locomo_gpio_set_dir(struct device *dev, unsigned int bits, unsigned int dir)
 
541
{
 
542
        struct locomo *lchip = dev_get_drvdata(dev);
 
543
        unsigned long flags;
 
544
        unsigned int r;
 
545
 
 
546
        if (!lchip)
 
547
                return;
 
548
 
 
549
        spin_lock_irqsave(&lchip->lock, flags);
 
550
 
 
551
        r = locomo_readl(lchip->base + LOCOMO_GPD);
 
552
        if (dir)
 
553
                r |= bits;
 
554
        else
 
555
                r &= ~bits;
 
556
        locomo_writel(r, lchip->base + LOCOMO_GPD);
 
557
 
 
558
        r = locomo_readl(lchip->base + LOCOMO_GPE);
 
559
        if (dir)
 
560
                r |= bits;
 
561
        else
 
562
                r &= ~bits;
 
563
        locomo_writel(r, lchip->base + LOCOMO_GPE);
 
564
 
 
565
        spin_unlock_irqrestore(&lchip->lock, flags);
 
566
}
 
567
EXPORT_SYMBOL(locomo_gpio_set_dir);
 
568
 
 
569
int locomo_gpio_read_level(struct device *dev, unsigned int bits)
 
570
{
 
571
        struct locomo *lchip = dev_get_drvdata(dev);
 
572
        unsigned long flags;
 
573
        unsigned int ret;
 
574
 
 
575
        if (!lchip)
 
576
                return -ENODEV;
 
577
 
 
578
        spin_lock_irqsave(&lchip->lock, flags);
 
579
        ret = locomo_readl(lchip->base + LOCOMO_GPL);
 
580
        spin_unlock_irqrestore(&lchip->lock, flags);
 
581
 
 
582
        ret &= bits;
 
583
        return ret;
 
584
}
 
585
EXPORT_SYMBOL(locomo_gpio_read_level);
 
586
 
 
587
int locomo_gpio_read_output(struct device *dev, unsigned int bits)
 
588
{
 
589
        struct locomo *lchip = dev_get_drvdata(dev);
 
590
        unsigned long flags;
 
591
        unsigned int ret;
 
592
 
 
593
        if (!lchip)
 
594
                return -ENODEV;
 
595
 
 
596
        spin_lock_irqsave(&lchip->lock, flags);
 
597
        ret = locomo_readl(lchip->base + LOCOMO_GPO);
 
598
        spin_unlock_irqrestore(&lchip->lock, flags);
 
599
 
 
600
        ret &= bits;
 
601
        return ret;
 
602
}
 
603
EXPORT_SYMBOL(locomo_gpio_read_output);
 
604
 
 
605
void locomo_gpio_write(struct device *dev, unsigned int bits, unsigned int set)
 
606
{
 
607
        struct locomo *lchip = dev_get_drvdata(dev);
 
608
        unsigned long flags;
 
609
        unsigned int r;
 
610
 
 
611
        if (!lchip)
 
612
                return;
 
613
 
 
614
        spin_lock_irqsave(&lchip->lock, flags);
 
615
 
 
616
        r = locomo_readl(lchip->base + LOCOMO_GPO);
 
617
        if (set)
 
618
                r |= bits;
 
619
        else
 
620
                r &= ~bits;
 
621
        locomo_writel(r, lchip->base + LOCOMO_GPO);
 
622
 
 
623
        spin_unlock_irqrestore(&lchip->lock, flags);
 
624
}
 
625
EXPORT_SYMBOL(locomo_gpio_write);
 
626
 
 
627
static void locomo_m62332_sendbit(void *mapbase, int bit)
 
628
{
 
629
        unsigned int r;
 
630
 
 
631
        r = locomo_readl(mapbase + LOCOMO_DAC);
 
632
        r &=  ~(LOCOMO_DAC_SCLOEB);
 
633
        locomo_writel(r, mapbase + LOCOMO_DAC);
 
634
        udelay(DAC_LOW_SETUP_TIME);     /* 300 nsec */
 
635
        udelay(DAC_DATA_HOLD_TIME);     /* 300 nsec */
 
636
        r = locomo_readl(mapbase + LOCOMO_DAC);
 
637
        r &=  ~(LOCOMO_DAC_SCLOEB);
 
638
        locomo_writel(r, mapbase + LOCOMO_DAC);
 
639
        udelay(DAC_LOW_SETUP_TIME);     /* 300 nsec */
 
640
        udelay(DAC_SCL_LOW_HOLD_TIME);  /* 4.7 usec */
 
641
 
 
642
        if (bit & 1) {
 
643
                r = locomo_readl(mapbase + LOCOMO_DAC);
 
644
                r |=  LOCOMO_DAC_SDAOEB;
 
645
                locomo_writel(r, mapbase + LOCOMO_DAC);
 
646
                udelay(DAC_HIGH_SETUP_TIME);    /* 1000 nsec */
 
647
        } else {
 
648
                r = locomo_readl(mapbase + LOCOMO_DAC);
 
649
                r &=  ~(LOCOMO_DAC_SDAOEB);
 
650
                locomo_writel(r, mapbase + LOCOMO_DAC);
 
651
                udelay(DAC_LOW_SETUP_TIME);     /* 300 nsec */
 
652
        }
 
653
 
 
654
        udelay(DAC_DATA_SETUP_TIME);    /* 250 nsec */
 
655
        r = locomo_readl(mapbase + LOCOMO_DAC);
 
656
        r |=  LOCOMO_DAC_SCLOEB;
 
657
        locomo_writel(r, mapbase + LOCOMO_DAC);
 
658
        udelay(DAC_HIGH_SETUP_TIME);    /* 1000 nsec */
 
659
        udelay(DAC_SCL_HIGH_HOLD_TIME); /*  4.0 usec */
 
660
}
 
661
 
 
662
void locomo_m62332_senddata(struct locomo_dev *ldev, unsigned int dac_data, int channel)
 
663
{
 
664
        struct locomo *lchip = locomo_chip_driver(ldev);
 
665
        int i;
 
666
        unsigned char data;
 
667
        unsigned int r;
 
668
        void *mapbase = lchip->base;
 
669
        unsigned long flags;
 
670
 
 
671
        spin_lock_irqsave(&lchip->lock, flags);
 
672
 
 
673
        /* Start */
 
674
        udelay(DAC_BUS_FREE_TIME);      /* 5.0 usec */
 
675
        r = locomo_readl(mapbase + LOCOMO_DAC);
 
676
        r |=  LOCOMO_DAC_SCLOEB | LOCOMO_DAC_SDAOEB;
 
677
        locomo_writel(r, mapbase + LOCOMO_DAC);
 
678
        udelay(DAC_HIGH_SETUP_TIME);    /* 1000 nsec */
 
679
        udelay(DAC_SCL_HIGH_HOLD_TIME); /* 4.0 usec */
 
680
        r = locomo_readl(mapbase + LOCOMO_DAC);
 
681
        r &=  ~(LOCOMO_DAC_SDAOEB);
 
682
        locomo_writel(r, mapbase + LOCOMO_DAC);
 
683
        udelay(DAC_START_HOLD_TIME);    /* 5.0 usec */
 
684
        udelay(DAC_DATA_HOLD_TIME);     /* 300 nsec */
 
685
 
 
686
        /* Send slave address and W bit (LSB is W bit) */
 
687
        data = (M62332_SLAVE_ADDR << 1) | M62332_W_BIT;
 
688
        for (i = 1; i <= 8; i++) {
 
689
                locomo_m62332_sendbit(mapbase, data >> (8 - i));
 
690
        }
 
691
 
 
692
        /* Check A bit */
 
693
        r = locomo_readl(mapbase + LOCOMO_DAC);
 
694
        r &=  ~(LOCOMO_DAC_SCLOEB);
 
695
        locomo_writel(r, mapbase + LOCOMO_DAC);
 
696
        udelay(DAC_LOW_SETUP_TIME);     /* 300 nsec */
 
697
        udelay(DAC_SCL_LOW_HOLD_TIME);  /* 4.7 usec */
 
698
        r = locomo_readl(mapbase + LOCOMO_DAC);
 
699
        r &=  ~(LOCOMO_DAC_SDAOEB);
 
700
        locomo_writel(r, mapbase + LOCOMO_DAC);
 
701
        udelay(DAC_LOW_SETUP_TIME);     /* 300 nsec */
 
702
        r = locomo_readl(mapbase + LOCOMO_DAC);
 
703
        r |=  LOCOMO_DAC_SCLOEB;
 
704
        locomo_writel(r, mapbase + LOCOMO_DAC);
 
705
        udelay(DAC_HIGH_SETUP_TIME);    /* 1000 nsec */
 
706
        udelay(DAC_SCL_HIGH_HOLD_TIME); /* 4.7 usec */
 
707
        if (locomo_readl(mapbase + LOCOMO_DAC) & LOCOMO_DAC_SDAOEB) {   /* High is error */
 
708
                printk(KERN_WARNING "locomo: m62332_senddata Error 1\n");
 
709
                goto out;
 
710
        }
 
711
 
 
712
        /* Send Sub address (LSB is channel select) */
 
713
        /*    channel = 0 : ch1 select              */
 
714
        /*            = 1 : ch2 select              */
 
715
        data = M62332_SUB_ADDR + channel;
 
716
        for (i = 1; i <= 8; i++) {
 
717
                locomo_m62332_sendbit(mapbase, data >> (8 - i));
 
718
        }
 
719
 
 
720
        /* Check A bit */
 
721
        r = locomo_readl(mapbase + LOCOMO_DAC);
 
722
        r &=  ~(LOCOMO_DAC_SCLOEB);
 
723
        locomo_writel(r, mapbase + LOCOMO_DAC);
 
724
        udelay(DAC_LOW_SETUP_TIME);     /* 300 nsec */
 
725
        udelay(DAC_SCL_LOW_HOLD_TIME);  /* 4.7 usec */
 
726
        r = locomo_readl(mapbase + LOCOMO_DAC);
 
727
        r &=  ~(LOCOMO_DAC_SDAOEB);
 
728
        locomo_writel(r, mapbase + LOCOMO_DAC);
 
729
        udelay(DAC_LOW_SETUP_TIME);     /* 300 nsec */
 
730
        r = locomo_readl(mapbase + LOCOMO_DAC);
 
731
        r |=  LOCOMO_DAC_SCLOEB;
 
732
        locomo_writel(r, mapbase + LOCOMO_DAC);
 
733
        udelay(DAC_HIGH_SETUP_TIME);    /* 1000 nsec */
 
734
        udelay(DAC_SCL_HIGH_HOLD_TIME); /* 4.7 usec */
 
735
        if (locomo_readl(mapbase + LOCOMO_DAC) & LOCOMO_DAC_SDAOEB) {   /* High is error */
 
736
                printk(KERN_WARNING "locomo: m62332_senddata Error 2\n");
 
737
                goto out;
 
738
        }
 
739
 
 
740
        /* Send DAC data */
 
741
        for (i = 1; i <= 8; i++) {
 
742
                locomo_m62332_sendbit(mapbase, dac_data >> (8 - i));
 
743
        }
 
744
 
 
745
        /* Check A bit */
 
746
        r = locomo_readl(mapbase + LOCOMO_DAC);
 
747
        r &=  ~(LOCOMO_DAC_SCLOEB);
 
748
        locomo_writel(r, mapbase + LOCOMO_DAC);
 
749
        udelay(DAC_LOW_SETUP_TIME);     /* 300 nsec */
 
750
        udelay(DAC_SCL_LOW_HOLD_TIME);  /* 4.7 usec */
 
751
        r = locomo_readl(mapbase + LOCOMO_DAC);
 
752
        r &=  ~(LOCOMO_DAC_SDAOEB);
 
753
        locomo_writel(r, mapbase + LOCOMO_DAC);
 
754
        udelay(DAC_LOW_SETUP_TIME);     /* 300 nsec */
 
755
        r = locomo_readl(mapbase + LOCOMO_DAC);
 
756
        r |=  LOCOMO_DAC_SCLOEB;
 
757
        locomo_writel(r, mapbase + LOCOMO_DAC);
 
758
        udelay(DAC_HIGH_SETUP_TIME);    /* 1000 nsec */
 
759
        udelay(DAC_SCL_HIGH_HOLD_TIME); /* 4.7 usec */
 
760
        if (locomo_readl(mapbase + LOCOMO_DAC) & LOCOMO_DAC_SDAOEB) {   /* High is error */
 
761
                printk(KERN_WARNING "locomo: m62332_senddata Error 3\n");
 
762
        }
 
763
 
 
764
out:
 
765
        /* stop */
 
766
        r = locomo_readl(mapbase + LOCOMO_DAC);
 
767
        r &=  ~(LOCOMO_DAC_SCLOEB);
 
768
        locomo_writel(r, mapbase + LOCOMO_DAC);
 
769
        udelay(DAC_LOW_SETUP_TIME);     /* 300 nsec */
 
770
        udelay(DAC_SCL_LOW_HOLD_TIME);  /* 4.7 usec */
 
771
        r = locomo_readl(mapbase + LOCOMO_DAC);
 
772
        r |=  LOCOMO_DAC_SCLOEB;
 
773
        locomo_writel(r, mapbase + LOCOMO_DAC);
 
774
        udelay(DAC_HIGH_SETUP_TIME);    /* 1000 nsec */
 
775
        udelay(DAC_SCL_HIGH_HOLD_TIME); /* 4 usec */
 
776
        r = locomo_readl(mapbase + LOCOMO_DAC);
 
777
        r |=  LOCOMO_DAC_SDAOEB;
 
778
        locomo_writel(r, mapbase + LOCOMO_DAC);
 
779
        udelay(DAC_HIGH_SETUP_TIME);    /* 1000 nsec */
 
780
        udelay(DAC_SCL_HIGH_HOLD_TIME); /* 4 usec */
 
781
 
 
782
        r = locomo_readl(mapbase + LOCOMO_DAC);
 
783
        r |=  LOCOMO_DAC_SCLOEB | LOCOMO_DAC_SDAOEB;
 
784
        locomo_writel(r, mapbase + LOCOMO_DAC);
 
785
        udelay(DAC_LOW_SETUP_TIME);     /* 1000 nsec */
 
786
        udelay(DAC_SCL_LOW_HOLD_TIME);  /* 4.7 usec */
 
787
 
 
788
        spin_unlock_irqrestore(&lchip->lock, flags);
 
789
}
 
790
EXPORT_SYMBOL(locomo_m62332_senddata);
 
791
 
 
792
/*
 
793
 *      Frontlight control
 
794
 */
 
795
 
 
796
void locomo_frontlight_set(struct locomo_dev *dev, int duty, int vr, int bpwf)
 
797
{
 
798
        unsigned long flags;
 
799
        struct locomo *lchip = locomo_chip_driver(dev);
 
800
 
 
801
        if (vr)
 
802
                locomo_gpio_write(dev->dev.parent, LOCOMO_GPIO_FL_VR, 1);
 
803
        else
 
804
                locomo_gpio_write(dev->dev.parent, LOCOMO_GPIO_FL_VR, 0);
 
805
 
 
806
        spin_lock_irqsave(&lchip->lock, flags);
 
807
        locomo_writel(bpwf, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALS);
 
808
        udelay(100);
 
809
        locomo_writel(duty, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALD);
 
810
        locomo_writel(bpwf | LOCOMO_ALC_EN, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALS);
 
811
        spin_unlock_irqrestore(&lchip->lock, flags);
 
812
}
 
813
EXPORT_SYMBOL(locomo_frontlight_set);
 
814
 
 
815
/*
 
816
 *      LoCoMo "Register Access Bus."
 
817
 *
 
818
 *      We model this as a regular bus type, and hang devices directly
 
819
 *      off this.
 
820
 */
 
821
static int locomo_match(struct device *_dev, struct device_driver *_drv)
 
822
{
 
823
        struct locomo_dev *dev = LOCOMO_DEV(_dev);
 
824
        struct locomo_driver *drv = LOCOMO_DRV(_drv);
 
825
 
 
826
        return dev->devid == drv->devid;
 
827
}
 
828
 
 
829
static int locomo_bus_suspend(struct device *dev, pm_message_t state)
 
830
{
 
831
        struct locomo_dev *ldev = LOCOMO_DEV(dev);
 
832
        struct locomo_driver *drv = LOCOMO_DRV(dev->driver);
 
833
        int ret = 0;
 
834
 
 
835
        if (drv && drv->suspend)
 
836
                ret = drv->suspend(ldev, state);
 
837
        return ret;
 
838
}
 
839
 
 
840
static int locomo_bus_resume(struct device *dev)
 
841
{
 
842
        struct locomo_dev *ldev = LOCOMO_DEV(dev);
 
843
        struct locomo_driver *drv = LOCOMO_DRV(dev->driver);
 
844
        int ret = 0;
 
845
 
 
846
        if (drv && drv->resume)
 
847
                ret = drv->resume(ldev);
 
848
        return ret;
 
849
}
 
850
 
 
851
static int locomo_bus_probe(struct device *dev)
 
852
{
 
853
        struct locomo_dev *ldev = LOCOMO_DEV(dev);
 
854
        struct locomo_driver *drv = LOCOMO_DRV(dev->driver);
 
855
        int ret = -ENODEV;
 
856
 
 
857
        if (drv->probe)
 
858
                ret = drv->probe(ldev);
 
859
        return ret;
 
860
}
 
861
 
 
862
static int locomo_bus_remove(struct device *dev)
 
863
{
 
864
        struct locomo_dev *ldev = LOCOMO_DEV(dev);
 
865
        struct locomo_driver *drv = LOCOMO_DRV(dev->driver);
 
866
        int ret = 0;
 
867
 
 
868
        if (drv->remove)
 
869
                ret = drv->remove(ldev);
 
870
        return ret;
 
871
}
 
872
 
 
873
struct bus_type locomo_bus_type = {
 
874
        .name           = "locomo-bus",
 
875
        .match          = locomo_match,
 
876
        .probe          = locomo_bus_probe,
 
877
        .remove         = locomo_bus_remove,
 
878
        .suspend        = locomo_bus_suspend,
 
879
        .resume         = locomo_bus_resume,
 
880
};
 
881
 
 
882
int locomo_driver_register(struct locomo_driver *driver)
 
883
{
 
884
        driver->drv.bus = &locomo_bus_type;
 
885
        return driver_register(&driver->drv);
 
886
}
 
887
EXPORT_SYMBOL(locomo_driver_register);
 
888
 
 
889
void locomo_driver_unregister(struct locomo_driver *driver)
 
890
{
 
891
        driver_unregister(&driver->drv);
 
892
}
 
893
EXPORT_SYMBOL(locomo_driver_unregister);
 
894
 
 
895
static int __init locomo_init(void)
 
896
{
 
897
        int ret = bus_register(&locomo_bus_type);
 
898
        if (ret == 0)
 
899
                platform_driver_register(&locomo_device_driver);
 
900
        return ret;
 
901
}
 
902
 
 
903
static void __exit locomo_exit(void)
 
904
{
 
905
        platform_driver_unregister(&locomo_device_driver);
 
906
        bus_unregister(&locomo_bus_type);
 
907
}
 
908
 
 
909
module_init(locomo_init);
 
910
module_exit(locomo_exit);
 
911
 
 
912
MODULE_DESCRIPTION("Sharp LoCoMo core driver");
 
913
MODULE_LICENSE("GPL");
 
914
MODULE_AUTHOR("John Lenz <lenz@cs.wisc.edu>");