Lines Matching +full:spi +full:- +full:cs +full:- +full:hold +full:- +full:delay +full:- +full:ns

1 // SPDX-License-Identifier: GPL-2.0-only
18 #include <linux/delay.h>
46 /* DAC setup and hold times (expressed in us) */
53 #define DAC_DATA_SETUP_TIME 1 /* 250 ns */
54 #define DAC_DATA_HOLD_TIME 1 /* 300 ns */
55 #define DAC_LOW_SETUP_TIME 1 /* 300 ns */
56 #define DAC_HIGH_SETUP_TIME 1 /* 1000 ns */
81 /* All the locomo devices. If offset is non-zero, the mapbase for the
90 .name = "locomo-keyboard",
97 .name = "locomo-frontlight",
105 .name = "locomo-backlight",
112 .name = "locomo-audio",
119 .name = "locomo-led",
126 .name = "locomo-uart",
133 .name = "locomo-spi",
145 desc->irq_data.chip->irq_ack(&desc->irq_data); in locomo_handler()
148 req = locomo_readl(lchip->base + LOCOMO_ICR) & 0x0f00; in locomo_handler()
154 irq = lchip->irq_base; in locomo_handler()
172 r = locomo_readl(lchip->base + LOCOMO_ICR); in locomo_mask_irq()
173 r &= ~(0x0010 << (d->irq - lchip->irq_base)); in locomo_mask_irq()
174 locomo_writel(r, lchip->base + LOCOMO_ICR); in locomo_mask_irq()
181 r = locomo_readl(lchip->base + LOCOMO_ICR); in locomo_unmask_irq()
182 r |= (0x0010 << (d->irq - lchip->irq_base)); in locomo_unmask_irq()
183 locomo_writel(r, lchip->base + LOCOMO_ICR); in locomo_unmask_irq()
195 int irq = lchip->irq_base; in locomo_setup_irq()
200 irq_set_irq_type(lchip->irq, IRQ_TYPE_EDGE_FALLING); in locomo_setup_irq()
201 irq_set_chained_handler_and_data(lchip->irq, locomo_handler, lchip); in locomo_setup_irq()
204 for ( ; irq <= lchip->irq_base + 3; irq++) { in locomo_setup_irq()
227 ret = -ENOMEM; in locomo_init_one_child()
235 if (lchip->dev->dma_mask) { in locomo_init_one_child()
236 dev->dma_mask = *lchip->dev->dma_mask; in locomo_init_one_child()
237 dev->dev.dma_mask = &dev->dma_mask; in locomo_init_one_child()
240 dev_set_name(&dev->dev, "%s", info->name); in locomo_init_one_child()
241 dev->devid = info->devid; in locomo_init_one_child()
242 dev->dev.parent = lchip->dev; in locomo_init_one_child()
243 dev->dev.bus = &locomo_bus_type; in locomo_init_one_child()
244 dev->dev.release = locomo_dev_release; in locomo_init_one_child()
245 dev->dev.coherent_dma_mask = lchip->dev->coherent_dma_mask; in locomo_init_one_child()
247 if (info->offset) in locomo_init_one_child()
248 dev->mapbase = lchip->base + info->offset; in locomo_init_one_child()
250 dev->mapbase = 0; in locomo_init_one_child()
251 dev->length = info->length; in locomo_init_one_child()
253 dev->irq[0] = (lchip->irq_base == NO_IRQ) ? in locomo_init_one_child()
254 NO_IRQ : lchip->irq_base + info->irq[0]; in locomo_init_one_child()
256 ret = device_register(&dev->dev); in locomo_init_one_child()
282 return -ENOMEM; in locomo_suspend()
284 lchip->saved_state = save; in locomo_suspend()
286 spin_lock_irqsave(&lchip->lock, flags); in locomo_suspend()
288 save->LCM_GPO = locomo_readl(lchip->base + LOCOMO_GPO); /* GPIO */ in locomo_suspend()
289 locomo_writel(0x00, lchip->base + LOCOMO_GPO); in locomo_suspend()
290 save->LCM_SPICT = locomo_readl(lchip->base + LOCOMO_SPI + LOCOMO_SPICT); /* SPI */ in locomo_suspend()
291 locomo_writel(0x40, lchip->base + LOCOMO_SPI + LOCOMO_SPICT); in locomo_suspend()
292 save->LCM_GPE = locomo_readl(lchip->base + LOCOMO_GPE); /* GPIO */ in locomo_suspend()
293 locomo_writel(0x00, lchip->base + LOCOMO_GPE); in locomo_suspend()
294 save->LCM_ASD = locomo_readl(lchip->base + LOCOMO_ASD); /* ADSTART */ in locomo_suspend()
295 locomo_writel(0x00, lchip->base + LOCOMO_ASD); in locomo_suspend()
296 save->LCM_SPIMD = locomo_readl(lchip->base + LOCOMO_SPI + LOCOMO_SPIMD); /* SPI */ in locomo_suspend()
297 locomo_writel(0x3C14, lchip->base + LOCOMO_SPI + LOCOMO_SPIMD); in locomo_suspend()
299 locomo_writel(0x00, lchip->base + LOCOMO_PAIF); in locomo_suspend()
300 locomo_writel(0x00, lchip->base + LOCOMO_DAC); in locomo_suspend()
301 locomo_writel(0x00, lchip->base + LOCOMO_BACKLIGHT + LOCOMO_TC); in locomo_suspend()
303 …if ((locomo_readl(lchip->base + LOCOMO_LED + LOCOMO_LPT0) & 0x88) && (locomo_readl(lchip->base + L… in locomo_suspend()
304 locomo_writel(0x00, lchip->base + LOCOMO_C32K); /* CLK32 off */ in locomo_suspend()
307 locomo_writel(0xc1, lchip->base + LOCOMO_C32K); /* CLK32 on */ in locomo_suspend()
309 locomo_writel(0x00, lchip->base + LOCOMO_TADC); /* 18MHz clock off*/ in locomo_suspend()
310 locomo_writel(0x00, lchip->base + LOCOMO_AUDIO + LOCOMO_ACC); /* 22MHz/24MHz clock off */ in locomo_suspend()
311 locomo_writel(0x00, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALS); /* FL */ in locomo_suspend()
313 spin_unlock_irqrestore(&lchip->lock, flags); in locomo_suspend()
325 save = lchip->saved_state; in locomo_resume()
329 spin_lock_irqsave(&lchip->lock, flags); in locomo_resume()
331 locomo_writel(save->LCM_GPO, lchip->base + LOCOMO_GPO); in locomo_resume()
332 locomo_writel(save->LCM_SPICT, lchip->base + LOCOMO_SPI + LOCOMO_SPICT); in locomo_resume()
333 locomo_writel(save->LCM_GPE, lchip->base + LOCOMO_GPE); in locomo_resume()
334 locomo_writel(save->LCM_ASD, lchip->base + LOCOMO_ASD); in locomo_resume()
335 locomo_writel(save->LCM_SPIMD, lchip->base + LOCOMO_SPI + LOCOMO_SPIMD); in locomo_resume()
337 locomo_writel(0x00, lchip->base + LOCOMO_C32K); in locomo_resume()
338 locomo_writel(0x90, lchip->base + LOCOMO_TADC); in locomo_resume()
340 locomo_writel(0, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KSC); in locomo_resume()
341 r = locomo_readl(lchip->base + LOCOMO_KEYBOARD + LOCOMO_KIC); in locomo_resume()
343 locomo_writel(r, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KIC); in locomo_resume()
344 locomo_writel(0x1, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KCMD); in locomo_resume()
346 spin_unlock_irqrestore(&lchip->lock, flags); in locomo_resume()
348 lchip->saved_state = NULL; in locomo_resume()
358 struct locomo_platform_data *pdata = me->platform_data; in __locomo_probe()
361 int i, ret = -ENODEV; in __locomo_probe()
365 return -ENOMEM; in __locomo_probe()
367 spin_lock_init(&lchip->lock); in __locomo_probe()
369 lchip->dev = me; in __locomo_probe()
370 dev_set_drvdata(lchip->dev, lchip); in __locomo_probe()
372 lchip->phys = mem->start; in __locomo_probe()
373 lchip->irq = irq; in __locomo_probe()
374 lchip->irq_base = (pdata) ? pdata->irq_base : NO_IRQ; in __locomo_probe()
380 lchip->base = ioremap(mem->start, PAGE_SIZE); in __locomo_probe()
381 if (!lchip->base) { in __locomo_probe()
382 ret = -ENOMEM; in __locomo_probe()
387 locomo_writel(0, lchip->base + LOCOMO_ICR); in __locomo_probe()
389 locomo_writel(0, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KIC); in __locomo_probe()
392 locomo_writel(0, lchip->base + LOCOMO_GPO); in __locomo_probe()
394 , lchip->base + LOCOMO_GPE); in __locomo_probe()
396 , lchip->base + LOCOMO_GPD); in __locomo_probe()
397 locomo_writel(0, lchip->base + LOCOMO_GIE); in __locomo_probe()
400 locomo_writel(0, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALS); in __locomo_probe()
401 locomo_writel(0, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALD); in __locomo_probe()
404 locomo_writel(0, lchip->base + LOCOMO_LTINT); in __locomo_probe()
405 /* SPI */ in __locomo_probe()
406 locomo_writel(0, lchip->base + LOCOMO_SPI + LOCOMO_SPIIE); in __locomo_probe()
408 locomo_writel(6 + 8 + 320 + 30 - 10, lchip->base + LOCOMO_ASD); in __locomo_probe()
409 r = locomo_readl(lchip->base + LOCOMO_ASD); in __locomo_probe()
411 locomo_writel(r, lchip->base + LOCOMO_ASD); in __locomo_probe()
413 locomo_writel(6 + 8 + 320 + 30 - 10 - 128 + 4, lchip->base + LOCOMO_HSD); in __locomo_probe()
414 r = locomo_readl(lchip->base + LOCOMO_HSD); in __locomo_probe()
416 locomo_writel(r, lchip->base + LOCOMO_HSD); in __locomo_probe()
418 locomo_writel(128 / 8, lchip->base + LOCOMO_HSC); in __locomo_probe()
421 locomo_writel(0x80, lchip->base + LOCOMO_TADC); in __locomo_probe()
424 r = locomo_readl(lchip->base + LOCOMO_TADC); in __locomo_probe()
426 locomo_writel(r, lchip->base + LOCOMO_TADC); in __locomo_probe()
430 r = locomo_readl(lchip->base + LOCOMO_DAC); in __locomo_probe()
432 locomo_writel(r, lchip->base + LOCOMO_DAC); in __locomo_probe()
434 r = locomo_readl(lchip->base + LOCOMO_VER); in __locomo_probe()
441 if (lchip->irq != NO_IRQ && lchip->irq_base != NO_IRQ) in __locomo_probe()
461 device_for_each_child(lchip->dev, NULL, locomo_remove_child); in __locomo_remove()
463 if (lchip->irq != NO_IRQ) { in __locomo_remove()
464 irq_set_chained_handler_and_data(lchip->irq, NULL, NULL); in __locomo_remove()
467 iounmap(lchip->base); in __locomo_remove()
472 * locomo_probe - probe for a single LoCoMo chip.
476 * before any other locomo-specific code.
479 * * %-EINVAL - device's IORESOURCE_MEM not found
480 * * %-ENXIO - could not allocate an IRQ for the device
481 * * %-ENODEV - device not found.
482 * * %-EBUSY - physical address already marked in-use.
483 * * %-ENOMEM - could not allocate or iomap memory.
484 * * %0 - successful.
493 return -EINVAL; in locomo_probe()
496 return -ENXIO; in locomo_probe()
498 return __locomo_probe(&dev->dev, mem, irq); in locomo_probe()
514 * the per-machine level, and then have this driver pick
535 return (struct locomo *)dev_get_drvdata(ldev->dev.parent); in locomo_chip_driver()
547 spin_lock_irqsave(&lchip->lock, flags); in locomo_gpio_set_dir()
549 r = locomo_readl(lchip->base + LOCOMO_GPD); in locomo_gpio_set_dir()
554 locomo_writel(r, lchip->base + LOCOMO_GPD); in locomo_gpio_set_dir()
556 r = locomo_readl(lchip->base + LOCOMO_GPE); in locomo_gpio_set_dir()
561 locomo_writel(r, lchip->base + LOCOMO_GPE); in locomo_gpio_set_dir()
563 spin_unlock_irqrestore(&lchip->lock, flags); in locomo_gpio_set_dir()
574 return -ENODEV; in locomo_gpio_read_level()
576 spin_lock_irqsave(&lchip->lock, flags); in locomo_gpio_read_level()
577 ret = locomo_readl(lchip->base + LOCOMO_GPL); in locomo_gpio_read_level()
578 spin_unlock_irqrestore(&lchip->lock, flags); in locomo_gpio_read_level()
592 return -ENODEV; in locomo_gpio_read_output()
594 spin_lock_irqsave(&lchip->lock, flags); in locomo_gpio_read_output()
595 ret = locomo_readl(lchip->base + LOCOMO_GPO); in locomo_gpio_read_output()
596 spin_unlock_irqrestore(&lchip->lock, flags); in locomo_gpio_read_output()
612 spin_lock_irqsave(&lchip->lock, flags); in locomo_gpio_write()
614 r = locomo_readl(lchip->base + LOCOMO_GPO); in locomo_gpio_write()
619 locomo_writel(r, lchip->base + LOCOMO_GPO); in locomo_gpio_write()
621 spin_unlock_irqrestore(&lchip->lock, flags); in locomo_gpio_write()
666 void *mapbase = lchip->base; in locomo_m62332_senddata()
669 spin_lock_irqsave(&lchip->lock, flags); in locomo_m62332_senddata()
687 locomo_m62332_sendbit(mapbase, data >> (8 - i)); in locomo_m62332_senddata()
715 locomo_m62332_sendbit(mapbase, data >> (8 - i)); in locomo_m62332_senddata()
740 locomo_m62332_sendbit(mapbase, dac_data >> (8 - i)); in locomo_m62332_senddata()
786 spin_unlock_irqrestore(&lchip->lock, flags); in locomo_m62332_senddata()
800 locomo_gpio_write(dev->dev.parent, LOCOMO_GPIO_FL_VR, 1); in locomo_frontlight_set()
802 locomo_gpio_write(dev->dev.parent, LOCOMO_GPIO_FL_VR, 0); in locomo_frontlight_set()
804 spin_lock_irqsave(&lchip->lock, flags); in locomo_frontlight_set()
805 locomo_writel(bpwf, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALS); in locomo_frontlight_set()
807 locomo_writel(duty, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALD); in locomo_frontlight_set()
808 locomo_writel(bpwf | LOCOMO_ALC_EN, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALS); in locomo_frontlight_set()
809 spin_unlock_irqrestore(&lchip->lock, flags); in locomo_frontlight_set()
824 return dev->devid == drv->devid; in locomo_match()
830 struct locomo_driver *drv = LOCOMO_DRV(dev->driver); in locomo_bus_probe()
831 int ret = -ENODEV; in locomo_bus_probe()
833 if (drv->probe) in locomo_bus_probe()
834 ret = drv->probe(ldev); in locomo_bus_probe()
841 struct locomo_driver *drv = LOCOMO_DRV(dev->driver); in locomo_bus_remove()
843 if (drv->remove) in locomo_bus_remove()
844 drv->remove(ldev); in locomo_bus_remove()
848 .name = "locomo-bus",
856 driver->drv.bus = &locomo_bus_type; in locomo_driver_register()
857 return driver_register(&driver->drv); in locomo_driver_register()
863 driver_unregister(&driver->drv); in locomo_driver_unregister()
886 MODULE_AUTHOR("John Lenz <lenz@cs.wisc.edu>");