glamo: Implement gpiolib for the glamo. Get rid of glamo-spi-gpio and use the generic spi-gpio driver instead.
SVN-Revision: 17048master
parent
4be26b9ae5
commit
23608e4c25
@ -1,278 +0,0 @@ |
||||
/*
|
||||
* Copyright (C) 2007 Openmoko, Inc. |
||||
* Author: Harald Welte <laforge@openmoko.org> |
||||
* |
||||
* Smedia Glamo GPIO based SPI driver |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License version 2 as |
||||
* published by the Free Software Foundation. |
||||
* |
||||
* This driver currently only implements a minimum subset of the hardware |
||||
* features, esp. those features that are required to drive the jbt6k74 |
||||
* LCM controller asic in the TD028TTEC1 LCM. |
||||
* |
||||
*/ |
||||
|
||||
#define DEBUG |
||||
|
||||
#include <linux/kernel.h> |
||||
#include <linux/init.h> |
||||
#include <linux/delay.h> |
||||
#include <linux/device.h> |
||||
#include <linux/spinlock.h> |
||||
#include <linux/platform_device.h> |
||||
|
||||
#include <linux/spi/spi.h> |
||||
#include <linux/spi/spi_bitbang.h> |
||||
#include <linux/spi/glamo.h> |
||||
|
||||
#include <linux/glamofb.h> |
||||
|
||||
#include <mach/hardware.h> |
||||
|
||||
#include "glamo-core.h" |
||||
#include "glamo-regs.h" |
||||
|
||||
struct glamo_spigpio { |
||||
struct spi_bitbang bitbang; |
||||
struct spi_master *master; |
||||
struct glamo_spigpio_platform_data *info; |
||||
}; |
||||
|
||||
static inline struct glamo_spigpio *to_sg(struct spi_device *spi) |
||||
{ |
||||
return dev_get_drvdata(&spi->master->dev); |
||||
} |
||||
|
||||
static inline void setsck(struct spi_device *dev, int on) |
||||
{ |
||||
struct glamo_spigpio *sg = to_sg(dev); |
||||
glamo_gpio_setpin(sg->info->core, sg->info->pin_clk, on ? 1 : 0); |
||||
} |
||||
|
||||
static inline void setmosi(struct spi_device *dev, int on) |
||||
{ |
||||
struct glamo_spigpio *sg = to_sg(dev); |
||||
glamo_gpio_setpin(sg->info->core, sg->info->pin_mosi, on ? 1 : 0); |
||||
} |
||||
|
||||
static inline u32 getmiso(struct spi_device *dev) |
||||
{ |
||||
struct glamo_spigpio *sg = to_sg(dev); |
||||
if (sg->info->pin_miso) |
||||
return glamo_gpio_getpin(sg->info->core, sg->info->pin_miso) ? 1 : 0; |
||||
else |
||||
return 0; |
||||
} |
||||
|
||||
#define spidelay(x) ndelay(x) |
||||
|
||||
#define EXPAND_BITBANG_TXRX |
||||
#include <linux/spi/spi_bitbang.h> |
||||
|
||||
static u32 glamo_spigpio_txrx_mode0(struct spi_device *spi, |
||||
unsigned nsecs, u32 word, u8 bits) |
||||
{ |
||||
return bitbang_txrx_be_cpha0(spi, nsecs, 0, word, bits); |
||||
} |
||||
|
||||
static u32 glamo_spigpio_txrx_mode1(struct spi_device *spi, |
||||
unsigned nsecs, u32 word, u8 bits) |
||||
{ |
||||
return bitbang_txrx_be_cpha1(spi, nsecs, 0, word, bits); |
||||
} |
||||
|
||||
static u32 glamo_spigpio_txrx_mode2(struct spi_device *spi, |
||||
unsigned nsecs, u32 word, u8 bits) |
||||
{ |
||||
return bitbang_txrx_be_cpha0(spi, nsecs, 1, word, bits); |
||||
} |
||||
|
||||
static u32 glamo_spigpio_txrx_mode3(struct spi_device *spi, |
||||
unsigned nsecs, u32 word, u8 bits) |
||||
{ |
||||
return bitbang_txrx_be_cpha1(spi, nsecs, 1, word, bits); |
||||
} |
||||
|
||||
|
||||
#if 0 |
||||
static int glamo_spigpio_setupxfer(struct spi_device *spi, |
||||
struct spi_transfer *t) |
||||
{ |
||||
struct glamo_spi *gs = to_sg(spi); |
||||
unsigned int bpw; |
||||
|
||||
bpw = t ? t->bits_per_word : spi->bits_per_word; |
||||
|
||||
if (bpw != 9 && bpw != 8) { |
||||
dev_err(&spi->dev, "invalid bits-per-word (%d)\n", bpw); |
||||
return -EINVAL; |
||||
} |
||||
|
||||
return 0; |
||||
} |
||||
#endif |
||||
|
||||
static void glamo_spigpio_chipsel(struct spi_device *spi, int value) |
||||
{ |
||||
struct glamo_spigpio *gs = to_sg(spi); |
||||
#if 0 |
||||
dev_dbg(&spi->dev, "chipsel %d: spi=%p, gs=%p, info=%p, handle=%p\n", |
||||
value, spi, gs, gs->info, gs->info->glamo); |
||||
#endif |
||||
glamo_gpio_setpin(gs->info->core, gs->info->pin_cs, value ? 0 : 1); |
||||
} |
||||
|
||||
|
||||
static int glamo_spigpio_probe(struct platform_device *pdev) |
||||
{ |
||||
struct spi_master *master; |
||||
struct glamo_spigpio *sp; |
||||
int ret; |
||||
|
||||
master = spi_alloc_master(&pdev->dev, sizeof(struct glamo_spigpio)); |
||||
if (master == NULL) { |
||||
dev_err(&pdev->dev, "failed to allocate spi master\n"); |
||||
ret = -ENOMEM; |
||||
goto err; |
||||
} |
||||
|
||||
sp = spi_master_get_devdata(master); |
||||
platform_set_drvdata(pdev, sp); |
||||
sp->info = pdev->dev.platform_data; |
||||
if (!sp->info) { |
||||
dev_err(&pdev->dev, "can't operate without platform data\n"); |
||||
ret = -EIO; |
||||
goto err_no_pdev; |
||||
} |
||||
|
||||
master->num_chipselect = 1; |
||||
master->bus_num = 2; /* FIXME: use dynamic number */ |
||||
|
||||
sp->master = spi_master_get(master); |
||||
|
||||
sp->bitbang.master = sp->master; |
||||
sp->bitbang.chipselect = glamo_spigpio_chipsel; |
||||
sp->bitbang.txrx_word[SPI_MODE_0] = glamo_spigpio_txrx_mode0; |
||||
sp->bitbang.txrx_word[SPI_MODE_1] = glamo_spigpio_txrx_mode1; |
||||
sp->bitbang.txrx_word[SPI_MODE_2] = glamo_spigpio_txrx_mode2; |
||||
sp->bitbang.txrx_word[SPI_MODE_3] = glamo_spigpio_txrx_mode3; |
||||
|
||||
/* set state of spi pins */ |
||||
glamo_gpio_setpin(sp->info->core, sp->info->pin_clk, 0); |
||||
glamo_gpio_setpin(sp->info->core, sp->info->pin_mosi, 0); |
||||
glamo_gpio_setpin(sp->info->core, sp->info->pin_cs, 1); |
||||
|
||||
glamo_gpio_cfgpin(sp->info->core, sp->info->pin_clk); |
||||
glamo_gpio_cfgpin(sp->info->core, sp->info->pin_mosi); |
||||
glamo_gpio_cfgpin(sp->info->core, sp->info->pin_cs); |
||||
if (sp->info->pin_miso) |
||||
glamo_gpio_cfgpin(sp->info->core, sp->info->pin_miso); |
||||
|
||||
/* bring the LCM panel out of reset if it isn't already */ |
||||
|
||||
glamo_gpio_setpin(sp->info->core, GLAMO_GPIO4, 1); |
||||
glamo_gpio_cfgpin(sp->info->core, GLAMO_GPIO4_OUTPUT); |
||||
msleep(90); |
||||
|
||||
#if 0 |
||||
sp->dev = &pdev->dev; |
||||
|
||||
sp->bitbang.setup_transfer = glamo_spi_setupxfer; |
||||
sp->bitbang.txrx_bufs = glamo_spi_txrx; |
||||
sp->bitbang.master->setup = glamo_spi_setup; |
||||
#endif |
||||
|
||||
dev_set_drvdata(&sp->master->dev, sp); |
||||
|
||||
ret = spi_bitbang_start(&sp->bitbang); |
||||
if (ret) |
||||
goto err_no_bitbang; |
||||
|
||||
return 0; |
||||
|
||||
err_no_bitbang: |
||||
platform_set_drvdata(pdev, NULL); |
||||
err_no_pdev: |
||||
spi_master_put(sp->bitbang.master); |
||||
err: |
||||
return ret; |
||||
|
||||
} |
||||
|
||||
static int glamo_spigpio_remove(struct platform_device *pdev) |
||||
{ |
||||
struct glamo_spigpio *sp = platform_get_drvdata(pdev); |
||||
|
||||
spi_bitbang_stop(&sp->bitbang); |
||||
spi_master_put(sp->bitbang.master); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
|
||||
#ifdef CONFIG_PM |
||||
/*static int glamo_spigpio_suspend(struct device *dev)
|
||||
{ |
||||
return 0; |
||||
}*/ |
||||
|
||||
static int glamo_spigpio_resume(struct device *dev) |
||||
{ |
||||
struct glamo_spigpio *sp = dev_get_drvdata(dev); |
||||
|
||||
if (!sp) |
||||
return 0; |
||||
|
||||
/* set state of spi pins */ |
||||
glamo_gpio_setpin(sp->info->core, sp->info->pin_clk, 0); |
||||
glamo_gpio_setpin(sp->info->core, sp->info->pin_mosi, 0); |
||||
glamo_gpio_setpin(sp->info->core, sp->info->pin_cs, 1); |
||||
|
||||
glamo_gpio_cfgpin(sp->info->core, sp->info->pin_clk); |
||||
glamo_gpio_cfgpin(sp->info->core, sp->info->pin_mosi); |
||||
glamo_gpio_cfgpin(sp->info->core, sp->info->pin_cs); |
||||
if (sp->info->pin_miso) |
||||
glamo_gpio_cfgpin(sp->info->core, sp->info->pin_miso); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static struct dev_pm_ops glamo_spigpio_pm_ops = { |
||||
/* .suspend = glamo_spiogpio_suspend,*/ |
||||
.resume_noirq = glamo_spigpio_resume, |
||||
}; |
||||
|
||||
#define GLAMO_SPIGPIO_PM_OPS (&glamo_spigpio_pm_ops) |
||||
|
||||
#else |
||||
#define GLAMO_SPIGPIO_PM_OPS NULL |
||||
#endif |
||||
|
||||
static struct platform_driver glamo_spi_drv = { |
||||
.probe = glamo_spigpio_probe, |
||||
.remove = glamo_spigpio_remove, |
||||
.driver = { |
||||
.name = "glamo-spi-gpio", |
||||
.owner = THIS_MODULE, |
||||
.pm = GLAMO_SPIGPIO_PM_OPS, |
||||
}, |
||||
}; |
||||
|
||||
static int __init glamo_spi_init(void) |
||||
{ |
||||
return platform_driver_register(&glamo_spi_drv); |
||||
} |
||||
|
||||
static void __exit glamo_spi_exit(void) |
||||
{ |
||||
platform_driver_unregister(&glamo_spi_drv); |
||||
} |
||||
|
||||
module_init(glamo_spi_init); |
||||
module_exit(glamo_spi_exit); |
||||
|
||||
MODULE_DESCRIPTION("Smedia Glamo 336x/337x LCM serial command SPI Driver"); |
||||
MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>") |
||||
MODULE_LICENSE("GPL"); |
@ -1,99 +0,0 @@ |
||||
#ifndef __GLAMO_GPIO_H |
||||
#define __GLAMO_GPIO_H |
||||
|
||||
struct glamo_core; |
||||
|
||||
#define GLAMO_GPIO_BANKA 0x0000 |
||||
#define GLAMO_GPIO_BANKB 0x1000 |
||||
#define GLAMO_GPIO_BANKC 0x2000 |
||||
#define GLAMO_GPIO_BANKD 0x3000 |
||||
|
||||
#define GLAMO_GPIONO(bank, pin) ((bank & 0xf000) | ((pin & 0xf) << 8)) |
||||
|
||||
#define GLAMO_GPIO_F_IN 0x0010 |
||||
#define GLAMO_GPIO_F_OUT 0x0020 |
||||
#define GLAMO_GPIO_F_FUNC 0x0030 |
||||
|
||||
#define GLAMO_GPIO0 GLAMO_GPIONO(GLAMO_GPIO_BANKA, 0) |
||||
#define GLAMO_GPIO0_INPUT (GLAMO_GPIO0 | GLAMO_GPIO_F_IN) |
||||
#define GLAMO_GPIO0_OUTPUT (GLAMO_GPIO0 | GLAMO_GPIO_F_OUT) |
||||
#define GLAMO_GPIO0_HA20 (GLAMO_GPIO0 | GLAMO_GPIO_F_FUNC) |
||||
|
||||
#define GLAMO_GPIO1 GLAMO_GPIONO(GLAMO_GPIO_BANKA, 1) |
||||
#define GLAMO_GPIO1_INPUT (GLAMO_GPIO1 | GLAMO_GPIO_F_IN) |
||||
#define GLAMO_GPIO1_OUTPUT (GLAMO_GPIO1 | GLAMO_GPIO_F_OUT) |
||||
#define GLAMO_GPIO1_HA21 (GLAMO_GPIO1 | GLAMO_GPIO_F_FUNC) |
||||
|
||||
#define GLAMO_GPIO2 GLAMO_GPIONO(GLAMO_GPIO_BANKA, 2) |
||||
#define GLAMO_GPIO2_INPUT (GLAMO_GPIO2 | GLAMO_GPIO_F_IN) |
||||
#define GLAMO_GPIO2_OUTPUT (GLAMO_GPIO2 | GLAMO_GPIO_F_OUT) |
||||
#define GLAMO_GPIO2_HA22 (GLAMO_GPIO2 | GLAMO_GPIO_F_FUNC) |
||||
|
||||
#define GLAMO_GPIO3 GLAMO_GPIONO(GLAMO_GPIO_BANKA, 3) |
||||
#define GLAMO_GPIO3_INPUT (GLAMO_GPIO3 | GLAMO_GPIO_F_IN) |
||||
#define GLAMO_GPIO3_OUTPUT (GLAMO_GPIO3 | GLAMO_GPIO_F_OUT) |
||||
#define GLAMO_GPIO3_HA23 (GLAMO_GPIO3 | GLAMO_GPIO_F_FUNC) |
||||
|
||||
#define GLAMO_GPIO4 GLAMO_GPIONO(GLAMO_GPIO_BANKB, 0) |
||||
#define GLAMO_GPIO4_INPUT (GLAMO_GPIO4 | GLAMO_GPIO_F_IN) |
||||
#define GLAMO_GPIO4_OUTPUT (GLAMO_GPIO4 | GLAMO_GPIO_F_OUT) |
||||
#define GLAMO_GPIO4_nLCS0 (GLAMO_GPIO4 | GLAMO_GPIO_F_FUNC) |
||||
|
||||
#define GLAMO_GPIO5 GLAMO_GPIONO(GLAMO_GPIO_BANKB, 1) |
||||
#define GLAMO_GPIO5_INPUT (GLAMO_GPIO5 | GLAMO_GPIO_F_IN) |
||||
#define GLAMO_GPIO5_OUTPUT (GLAMO_GPIO5 | GLAMO_GPIO_F_OUT) |
||||
#define GLAMO_GPIO5_nLCS1 (GLAMO_GPIO5 | GLAMO_GPIO_F_FUNC) |
||||
|
||||
#define GLAMO_GPIO6 GLAMO_GPIONO(GLAMO_GPIO_BANKB, 2) |
||||
#define GLAMO_GPIO6_INPUT (GLAMO_GPIO6 | GLAMO_GPIO_F_IN) |
||||
#define GLAMO_GPIO6_OUTPUT (GLAMO_GPIO6 | GLAMO_GPIO_F_OUT) |
||||
#define GLAMO_GPIO6_LDCLK (GLAMO_GPIO6 | GLAMO_GPIO_F_FUNC) |
||||
|
||||
#define GLAMO_GPIO7 GLAMO_GPIONO(GLAMO_GPIO_BANKB, 3) |
||||
#define GLAMO_GPIO7_INPUT (GLAMO_GPIO7 | GLAMO_GPIO_F_IN) |
||||
#define GLAMO_GPIO7_OUTPUT (GLAMO_GPIO7 | GLAMO_GPIO_F_OUT) |
||||
#define GLAMO_GPIO7_nLDE (GLAMO_GPIO7 | GLAMO_GPIO_F_FUNC) |
||||
|
||||
#define GLAMO_GPIO8 GLAMO_GPIONO(GLAMO_GPIO_BANKC, 0) |
||||
#define GLAMO_GPIO8_INPUT (GLAMO_GPIO8 | GLAMO_GPIO_F_IN) |
||||
#define GLAMO_GPIO8_OUTPUT (GLAMO_GPIO8 | GLAMO_GPIO_F_OUT) |
||||
#define GLAMO_GPIO8_LD16 (GLAMO_GPIO8 | GLAMO_GPIO_F_FUNC) |
||||
|
||||
#define GLAMO_GPIO9 GLAMO_GPIONO(GLAMO_GPIO_BANKC, 1) |
||||
#define GLAMO_GPIO9_INPUT (GLAMO_GPIO9 | GLAMO_GPIO_F_IN) |
||||
#define GLAMO_GPIO9_OUTPUT (GLAMO_GPIO9 | GLAMO_GPIO_F_OUT) |
||||
#define GLAMO_GPIO9_LD17 (GLAMO_GPIO9 | GLAMO_GPIO_F_FUNC) |
||||
|
||||
#define GLAMO_GPIO10 GLAMO_GPIONO(GLAMO_GPIO_BANKC, 2) |
||||
#define GLAMO_GPIO10_INPUT (GLAMO_GPIO10 | GLAMO_GPIO_F_IN) |
||||
#define GLAMO_GPIO10_OUTPUT (GLAMO_GPIO10 | GLAMO_GPIO_F_OUT) |
||||
#define GLAMO_GPIO10_LSCK (GLAMO_GPIO10 | GLAMO_GPIO_F_FUNC) |
||||
|
||||
#define GLAMO_GPIO11 GLAMO_GPIONO(GLAMO_GPIO_BANKC, 3) |
||||
#define GLAMO_GPIO11_INPUT (GLAMO_GPIO11 | GLAMO_GPIO_F_IN) |
||||
#define GLAMO_GPIO11_OUTPUT (GLAMO_GPIO11 | GLAMO_GPIO_F_OUT) |
||||
#define GLAMO_GPIO11_LSDA (GLAMO_GPIO11 | GLAMO_GPIO_F_FUNC) |
||||
|
||||
#define GLAMO_GPIO12 GLAMO_GPIONO(GLAMO_GPIO_BANKD, 0) |
||||
#define GLAMO_GPIO12_INPUT (GLAMO_GPIO12 | GLAMO_GPIO_F_IN) |
||||
#define GLAMO_GPIO12_OUTPUT (GLAMO_GPIO12 | GLAMO_GPIO_F_OUT) |
||||
#define GLAMO_GPIO12_LSA0 (GLAMO_GPIO12 | GLAMO_GPIO_F_FUNC) |
||||
|
||||
|
||||
#define REG_OF_GPIO(gpio) (((gpio & 0xf000) >> 12)*2 \ |
||||
+ GLAMO_REG_GPIO_GEN1) |
||||
#define NUM_OF_GPIO(gpio) ((gpio & 0x0f00) >> 8) |
||||
#define GPIO_OUT_BIT(gpio) (1 << (NUM_OF_GPIO(gpio) + 0)) |
||||
#define OUTPUT_BIT(gpio) (1 << (NUM_OF_GPIO(gpio) + 4)) |
||||
#define INPUT_BIT(gpio) (1 << (NUM_OF_GPIO(gpio) + 8)) |
||||
#define FUNC_BIT(gpio) (1 << (NUM_OF_GPIO(gpio) + 12)) |
||||
|
||||
void glamo_gpio_setpin(struct glamo_core *glamo, unsigned int pin, |
||||
unsigned int value); |
||||
|
||||
int glamo_gpio_getpin(struct glamo_core *glamo, unsigned int pin); |
||||
|
||||
void glamo_gpio_cfgpin(struct glamo_core *glamo, unsigned int pinfunc); |
||||
|
||||
|
||||
#endif /* _GLAMO_GPIO */ |
@ -1,19 +0,0 @@ |
||||
#ifndef __GLAMO_SPI_H |
||||
#define __GLAMO_SPI_H |
||||
|
||||
#include <linux/glamo-gpio.h> |
||||
|
||||
struct glamo_core; |
||||
|
||||
struct glamo_spigpio_platform_data { |
||||
unsigned int pin_clk; |
||||
unsigned int pin_mosi; |
||||
unsigned int pin_miso; |
||||
unsigned int pin_cs; |
||||
int bus_num; |
||||
|
||||
struct glamo_core *core; |
||||
}; |
||||
|
||||
|
||||
#endif |
Loading…
Reference in new issue