[oe-commits] org.oe.dev linux-rp 2.6.21: adapted collie patches to apply - close #2592

hrw commit openembedded-commits at lists.openembedded.org
Tue Jul 3 22:58:31 UTC 2007


linux-rp 2.6.21: adapted collie patches to apply - close #2592

Author: hrw at openembedded.org
Branch: org.openembedded.dev
Revision: 290305d126092679b5d9b8f4f299b6dce4dd8da6
ViewMTN: http://monotone.openembedded.org/revision.psp?id=290305d126092679b5d9b8f4f299b6dce4dd8da6
Files:
1
packages/linux/linux-rp-2.6.21/locomo_spi-r4.patch
packages/linux/linux-rp-2.6.21/sharpsl_pm-r1.patch
packages/linux/linux-rp_2.6.21.bb
Diffs:

#
# mt diff -r80ab682c6bb8a0598f7082eb2cfc84039cc516ba -r290305d126092679b5d9b8f4f299b6dce4dd8da6
#
# 
# 
# add_file "packages/linux/linux-rp-2.6.21/locomo_spi-r4.patch"
#  content [b8a26ac453b32eabec7a152dc8995c03346c07fa]
# 
# add_file "packages/linux/linux-rp-2.6.21/sharpsl_pm-r1.patch"
#  content [bb565e82d3dbd8bf8be036f83d615b6a6fb269e4]
# 
# patch "packages/linux/linux-rp_2.6.21.bb"
#  from [0611fe14d6ba36f9557f2f7c5814c1be6fbd7f84]
#    to [5d348ef8f6a5dc664eff63b881524743de37d12b]
# 
============================================================
--- packages/linux/linux-rp-2.6.21/locomo_spi-r4.patch	b8a26ac453b32eabec7a152dc8995c03346c07fa
+++ packages/linux/linux-rp-2.6.21/locomo_spi-r4.patch	b8a26ac453b32eabec7a152dc8995c03346c07fa
@@ -0,0 +1,947 @@
+Index: linux-2.6.21/drivers/spi/Kconfig
+===================================================================
+--- linux-2.6.21.orig/drivers/spi/Kconfig	2007-04-26 05:08:32.000000000 +0200
++++ linux-2.6.21/drivers/spi/Kconfig	2007-07-03 21:40:52.000000000 +0200
+@@ -89,6 +89,10 @@
+ 	  This enables using the Freescale iMX SPI controller in master
+ 	  mode.
+ 
++config SPI_LOCOMO
++	tristate "Locomo SPI master"
++	depends on SPI_MASTER && SHARP_LOCOMO && EXPERIMENTAL
++
+ config SPI_MPC83xx
+ 	tristate "Freescale MPC83xx SPI controller"
+ 	depends on SPI_MASTER && PPC_83xx && EXPERIMENTAL
+Index: linux-2.6.21/drivers/spi/locomo_spi.c
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.21/drivers/spi/locomo_spi.c	2007-07-03 21:40:52.000000000 +0200
+@@ -0,0 +1,873 @@
++#include <asm/io.h>
++#include <asm/irq.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/device.h>
++#include <linux/stat.h>
++#include <linux/delay.h>
++#include <linux/interrupt.h>
++#include <asm/hardware/locomo.h>
++#include <linux/mmc/host.h>
++#include <linux/spi/spi.h>
++#include <linux/spi/mmc_spi.h>
++#include <linux/workqueue.h>
++#include <linux/spinlock.h>
++#include <linux/list.h>
++#include "locomo_spi.h"
++static struct locomospi_dev * spidev;
++static struct work_struct transfer_wq;
++int verbose=0;
++/* MMC_SPI functions *********************************************************/
++
++static int locomommcspi_init(struct device *dev, irqreturn_t (*isr)(int, void*), void *mmc)
++{
++	int result;
++	locomo_gpio_set_irq(spidev->ldev->dev.parent, LOCOMO_GPIO_CARD_DETECT, LOCOMO_GPIO_IRQ_ON_RISE | LOCOMO_GPIO_IRQ_ON_FALL);
++	spidev->mmc_spi_isr = isr;
++	result=request_irq(IRQ_LOCOMO_CARDDETECT, locomospi_cardisr, SA_SHIRQ, "locomo-spi",  mmc);
++	return result;
++}
++
++static void locomommcspi_exit(struct device *dev, void* mmc)
++{
++	free_irq(IRQ_LOCOMO_CARDDETECT, mmc);
++}
++
++static int locomommcspi_getro(struct device *dev)
++{
++	return locomo_gpio_read_level(spidev->ldev->dev.parent,LOCOMO_GPIO_WRITE_PROTECT) > 0 ? 1 : 0;
++}
++
++static void locomommcspi_powermode(struct device *dev, unsigned char mode)
++{
++	if(mode == MMC_POWER_OFF && spidev->card_power != 0)
++		locomospi_power(0);
++	else if( spidev->card_power != 1)
++		locomospi_power(1);
++
++}
++
++static void locomommcspi_reset(void)
++{
++	/* transmit card reset sequence, should be done from mmc_layer */
++	locomospi_setcs(1);
++	tx("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",10);
++	locomospi_setcs(0);
++}
++
++
++static struct mmc_spi_platform_data colliemmc ={
++	.init 		= locomommcspi_init,
++	.exit 		= locomommcspi_exit,
++	.detect_delay 	= HZ,
++	.get_ro 	= locomommcspi_getro,
++	.ocr_mask 	= MMC_VDD_32_33 | MMC_VDD_33_34,
++	.setpowermode	= locomommcspi_powermode,
++	.reset		= locomommcspi_reset,
++};
++
++/* Utility function **********************************************************/
++
++static irqreturn_t locomospi_cardisr(int irq, void *dev_id)
++{
++	u16 r;
++	if(locomospi_carddetect()){
++		r = locomo_readl(spidev->base+LOCOMO_SPIMD);
++		r |= 0x80;
++		locomo_writel( r, spidev->base+LOCOMO_SPIMD);
++		r = locomo_readl(spidev->base+LOCOMO_SPIMD);
++		r |= 0x40;
++		locomo_writel( r, spidev->base+LOCOMO_SPIMD);
++		/* transmit card reset sequence, should be done from mmc_layer */
++//		locomospi_setcs(1);
++  //              tx("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",10);
++//                locomospi_setcs(0);
++	} else {
++		r = locomo_readl(spidev->base+LOCOMO_SPIMD);
++		r &= ~0x80;
++		locomo_writel( r, spidev->base+LOCOMO_SPIMD);
++		r = locomo_readl(spidev->base+LOCOMO_SPIMD);
++		r &= ~0x40;
++		locomo_writel( r, spidev->base+LOCOMO_SPIMD);
++	}
++	return spidev->mmc_spi_isr(irq, dev_id);
++}
++
++static void locomospi_power(int on)
++{
++	locomo_gpio_write(spidev->ldev->dev.parent, LOCOMO_GPIO_CARD_POWER, on);
++	spidev->card_power=on;
++	set_current_state(TASK_INTERRUPTIBLE);
++	if(on){
++		schedule_timeout(HZ/10);
++	} else {
++		schedule_timeout(2*HZ);
++	}
++
++}
++
++static void locomospi_setclock(unsigned int base, unsigned int mult)
++{
++	u16 r = locomo_readl(spidev->base+LOCOMO_SPIMD);
++	base &= 0x7;
++	mult &= 0x3;
++	r &= ~(0x7  | 0x18       | 0x40);
++	locomo_writel(r,spidev->base+LOCOMO_SPIMD);
++	r |=  (base | (mult <<3) | 0x40);
++	locomo_writel(r,spidev->base+LOCOMO_SPIMD);
++	spidev->clock_base = base;
++	spidev->clock_mult = mult;
++
++}
++// returns 1 if card ist present, 0 otherwise
++static int locomospi_carddetect()
++{
++	return (locomo_gpio_read_level(spidev->ldev->dev.parent,LOCOMO_GPIO_CARD_DETECT)>0)?0:1;
++}
++
++static void locomospi_togglecs()
++{
++	u16 r;
++	r = locomo_readl(spidev->base + LOCOMO_SPICT);
++	r ^= 0x40; // I think this is CHIPSELECTHIGH
++	locomo_writel(r, spidev->base + LOCOMO_SPICT);
++}
++
++static void locomospi_setcs(int high)
++{
++	u16 r;
++	r = locomo_readl(spidev->base + LOCOMO_SPICT);
++	if(high)
++		r |= 0x40;
++	else
++		r &= ~0x40;
++	locomo_writel(r, spidev->base + LOCOMO_SPICT);
++}
++
++static void locomospi_reg_open()
++{
++	u16 r;
++	spidev->clock_base = 4;
++	spidev->clock_mult = 0;
++	locomospi_power(1);
++	locomo_writel( 0x6c00 | (2 <<3)|4, spidev->base+LOCOMO_SPIMD);
++	if(locomospi_carddetect()){
++		r = locomo_readl(spidev->base+LOCOMO_SPIMD);
++		r |= 0x80;
++		locomo_writel( r, spidev->base+LOCOMO_SPIMD);
++		r = locomo_readl(spidev->base+LOCOMO_SPIMD);
++		r |= 0x40;
++		locomo_writel( r, spidev->base+LOCOMO_SPIMD);
++	}
++	locomo_writel( 0x40, spidev->base+LOCOMO_SPICT);
++	r = locomo_readl(spidev->base+LOCOMO_SPICT);
++	r |= 0x80;
++	locomo_writel( r, spidev->base+LOCOMO_SPICT);
++	udelay(200);
++	r = locomo_readl(spidev->base+LOCOMO_SPICT);
++	locomo_writel(r, spidev->base+LOCOMO_SPICT);
++	r = locomo_readl(spidev->base+LOCOMO_SPICT);
++	r |= 0x1;
++	locomo_writel(r, spidev->base+LOCOMO_SPICT);
++	r = locomo_readl(spidev->base+LOCOMO_SPICT);
++	r &= ~0x40;
++	locomo_writel(r, spidev->base+LOCOMO_SPICT);
++}
++
++static void locomospi_reg_release()
++{
++	u16 r;
++	r = locomo_readl(spidev->base+LOCOMO_SPICT);
++	r &= ~0x80;
++	locomo_writel(r, spidev->base+LOCOMO_SPICT);
++	r = locomo_readl(spidev->base+LOCOMO_SPIMD);
++	r &= ~0x40;
++	locomo_writel(r, spidev->base+LOCOMO_SPIMD);
++	r = locomo_readl(spidev->base+LOCOMO_SPIMD);
++	r &= ~0x80;
++	locomo_writel(r, spidev->base+LOCOMO_SPIMD);
++	r = locomo_readl(spidev->base+LOCOMO_SPICT);
++	r |= 0x40;
++	locomo_writel(r, spidev->base+LOCOMO_SPICT);
++	locomospi_power(0);
++}
++
++static int tx(const char* buffer, int size)
++{
++	int i=0,j=0;
++//	int result=0;
++	int wait;
++	if(!spidev->clock_base && !spidev->clock_mult)
++		return 0;
++	if(spidev->clock_base == 4)
++		wait = 0x10000;
++	else
++		wait = 8;
++
++	for(i=0; i<size; i++){
++/*		if(!(locomo_readl(spidev->base+LOCOMO_SPIST) & LOCOMO_SPI_RFW)){
++			result = wait_event_interruptible(spidev->waitqueue, locomo_readl(spidev->base+LOCOMO_SPIST) & LOCOMO_SPI_RFW);
++			if(result) {
++				dev_err(&spidev->sdev->dev, "received Signal. giving up tx.");
++				return i;
++			}
++		}*/
++		for(j=0; j <= wait; j++){
++			if(locomo_readl(spidev->base+LOCOMO_SPIST) & LOCOMO_SPI_RFW)
++				break;
++		}
++		locomo_writel((u16) buffer[i], spidev->base+LOCOMO_SPITD);
++		if(verbose)
++			printk(KERN_DEBUG "locomospi: sent:  char :%x\n", (u16) buffer[i]);
++		if(spidev->clock_base){
++			for(j=0; j <= wait; j++){
++				if(!(locomo_readl(spidev->base+LOCOMO_SPIST) & LOCOMO_SPI_RFW))
++					break;
++			}
++		}
++	}
++	if(spidev->clock_base){
++		for(i=0; i <= wait; i++){
++			if(locomo_readl(spidev->base+LOCOMO_SPIST) & LOCOMO_SPI_TEND)
++				break;
++		}
++	}
++	return j;
++}
++
++static int rx(char* buffer, int size)
++{
++	int i,j;
++//	int result=0;
++	int wait;
++	u16 rd;
++	if(!spidev->clock_base && !spidev->clock_mult)
++		return 0;
++	if(spidev->clock_base == 4)
++		wait = 0x10000;
++	else
++		wait = 8;
++
++	for(i=0; i<size; i++){
++/*		if(!(locomo_readl(spidev->base+LOCOMO_SPIST) & LOCOMO_SPI_RFW)){
++			result = wait_event_interruptible(spidev->waitqueue, locomo_readl(spidev->base+LOCOMO_SPIST) & LOCOMO_SPI_RFW);
++			if(result) {
++				dev_err(&spidev->sdev->dev, "received Signal. giving up tx.");
++				return i;
++			}
++		}*/
++		for(j=0; j <= wait; j++){
++			if(locomo_readl(spidev->base+LOCOMO_SPIST) & LOCOMO_SPI_RFR)
++				break;
++		}
++		rd= locomo_readl(spidev->base+LOCOMO_SPIRD);
++		if(verbose)
++			printk(KERN_DEBUG "locomospi: received:  char :%x\n", (u16) buffer[i]);
++		buffer[i]=(char) rd;
++		if(spidev->clock_base){
++			for(j=0; j <= wait; j++){
++				if(!(locomo_readl(spidev->base+LOCOMO_SPIST) & LOCOMO_SPI_RFR))
++					break;
++			}
++		}
++	}
++	return i;
++}
++
++/*
++static irqreturn_t locomospi_rwready(int irq, void *dev_id)
++{
++	struct locomospi_dev* dev=(struct locomospi_dev*) dev_id;
++//	dev_dbg(&spidev->sdev->dev, "IRQ: %d\n", irq);
++//	printk(KERN_DEBUG "locomospi: IRQ: %d\n", irq);
++	wake_up_interruptible(&dev->waitqueue);
++	return IRQ_HANDLED;
++}
++
++static irqreturn_t locomospi_testisr(int irq, void *dev_id)
++{
++	char *buf="";
++	switch(irq){
++		case IRQ_LOCOMO_SPI_RFR: buf="RFR";
++					 break;
++		case IRQ_LOCOMO_SPI_RFW: buf="RFW";
++					 break;
++		case IRQ_LOCOMO_SPI_OVRN:buf="OVRN";
++					 break;
++		case IRQ_LOCOMO_SPI_TEND:buf="TEND";
++					 break;
++		case IRQ_LOCOMO_CARDDETECT:
++					 buf="CARD_DETECT";
++					 break;
++		default:		return IRQ_NONE;
++	}
++	printk(KERN_DEBUG "locomospi: IRQ: %s\n",buf);
++//	dev_dbg(&spidev->sdev->dev, "IRQ: %s\n",buf);
++	return IRQ_HANDLED;
++}
++*/
++/* sysfs attributes used for debug *******************************************/
++
++/* SPI registers */
++ssize_t locomospi_showspimd(struct device_driver *drv, char *buf)
++{
++	return sprintf(buf, "0x%x\n", locomo_readl(spidev->base+LOCOMO_SPIMD));
++}
++
++ssize_t locomospi_storespimd(struct device_driver *drv, const char *buf, size_t count)
++{
++	locomo_writel(simple_strtoul(buf, NULL, 16), spidev->base+LOCOMO_SPIMD);
++	return count;
++}
++static DRIVER_ATTR(spimd, S_IWUSR | S_IRUGO, locomospi_showspimd, locomospi_storespimd);
++
++ssize_t locomospi_showspict(struct device_driver *drv, char *buf)
++{
++	return sprintf(buf, "0x%x\n", locomo_readl(spidev->base+LOCOMO_SPICT));
++}
++
++ssize_t locomospi_storespict(struct device_driver *drv, const char *buf, size_t count)
++{
++	locomo_writel(simple_strtoul(buf, NULL, 16), spidev->base+LOCOMO_SPICT);
++	return count;
++}
++static DRIVER_ATTR(spict, S_IWUSR | S_IRUGO, locomospi_showspict, locomospi_storespict);
++
++ssize_t locomospi_showspist(struct device_driver *drv, char *buf)
++{
++	return sprintf(buf, "0x%x\n", locomo_readl(spidev->base+LOCOMO_SPIST));
++}
++
++ssize_t locomospi_storespist(struct device_driver *drv, const char *buf, size_t count)
++{
++	locomo_writel(simple_strtoul(buf, NULL, 16), spidev->base+LOCOMO_SPIST);
++	return count;
++}
++static DRIVER_ATTR(spist, S_IWUSR | S_IRUGO, locomospi_showspist, locomospi_storespist);
++
++ssize_t locomospi_showspiis(struct device_driver *drv, char *buf)
++{
++	return sprintf(buf, "0x%x\n", locomo_readl(spidev->base+LOCOMO_SPIIS));
++}
++
++ssize_t locomospi_storespiis(struct device_driver *drv, const char *buf, size_t count)
++{
++	locomo_writel(simple_strtoul(buf, NULL, 16), spidev->base+LOCOMO_SPIIS);
++	return count;
++}
++static DRIVER_ATTR(spiis, S_IWUSR | S_IRUGO, locomospi_showspiis, locomospi_storespiis);
++
++ssize_t locomospi_showspiwe(struct device_driver *drv, char *buf)
++{
++	return sprintf(buf, "0x%x\n", locomo_readl(spidev->base+LOCOMO_SPIWE));
++}
++
++ssize_t locomospi_storespiwe(struct device_driver *drv, const char *buf, size_t count)
++{
++	locomo_writel(simple_strtoul(buf, NULL, 16), spidev->base+LOCOMO_SPIWE);
++	return count;
++}
++static DRIVER_ATTR(spiwe, S_IWUSR | S_IRUGO, locomospi_showspiwe, locomospi_storespiwe);
++
++ssize_t locomospi_showspiie(struct device_driver *drv, char *buf)
++{
++	return sprintf(buf, "0x%x\n", locomo_readl(spidev->base+LOCOMO_SPIIE));
++}
++
++ssize_t locomospi_storespiie(struct device_driver *drv, const char *buf, size_t count)
++{
++	locomo_writel(simple_strtoul(buf, NULL, 16), spidev->base+LOCOMO_SPIIE);
++	return count;
++}
++static DRIVER_ATTR(spiie, S_IWUSR | S_IRUGO, locomospi_showspiie, locomospi_storespiie);
++
++ssize_t locomospi_showspiir(struct device_driver *drv, char *buf)
++{
++	return sprintf(buf, "0x%x\n", locomo_readl(spidev->base+LOCOMO_SPIIR));
++}
++
++ssize_t locomospi_storespiir(struct device_driver *drv, const char *buf, size_t count)
++{
++	locomo_writel(simple_strtoul(buf, NULL, 16), spidev->base+LOCOMO_SPIIR);
++	return count;
++}
++static DRIVER_ATTR(spiir, S_IWUSR | S_IRUGO, locomospi_showspiir, locomospi_storespiir);
++
++ssize_t locomospi_showspitd(struct device_driver *drv, char *buf)
++{
++	return sprintf(buf, "0x%x\n", locomo_readl(spidev->base+LOCOMO_SPITD));
++}
++
++ssize_t locomospi_storespitd(struct device_driver *drv, const char *buf, size_t count)
++{
++	locomo_writel(simple_strtoul(buf, NULL, 16), spidev->base+LOCOMO_SPITD);
++	return count;
++}
++static DRIVER_ATTR(spitd, S_IWUSR | S_IRUGO, locomospi_showspitd, locomospi_storespitd);
++
++ssize_t locomospi_showspird(struct device_driver *drv, char *buf)
++{
++	return sprintf(buf, "0x%x\n", locomo_readl(spidev->base+LOCOMO_SPIRD));
++}
++
++ssize_t locomospi_storespird(struct device_driver *drv, const char *buf, size_t count)
++{
++	locomo_writel(simple_strtoul(buf, NULL, 16), spidev->base+LOCOMO_SPIRD);
++	return count;
++}
++static DRIVER_ATTR(spird, S_IWUSR | S_IRUGO, locomospi_showspird, locomospi_storespird);
++
++ssize_t locomospi_showspits(struct device_driver *drv, char *buf)
++{
++	return sprintf(buf, "0x%x\n", locomo_readl(spidev->base+LOCOMO_SPITS));
++}
++
++ssize_t locomospi_storespits(struct device_driver *drv, const char *buf, size_t count)
++{
++	locomo_writel(simple_strtoul(buf, NULL, 16), spidev->base+LOCOMO_SPITS);
++	return count;
++}
++static DRIVER_ATTR(spits, S_IWUSR | S_IRUGO, locomospi_showspits, locomospi_storespits);
++
++ssize_t locomospi_showspirs(struct device_driver *drv, char *buf)
++{
++	return sprintf(buf, "0x%x\n", locomo_readl(spidev->base+LOCOMO_SPIRS));
++}
++
++ssize_t locomospi_storespirs(struct device_driver *drv, const char *buf, size_t count)
++{
++	locomo_writel(simple_strtoul(buf, NULL, 16), spidev->base+LOCOMO_SPIRS);
++	return count;
++}
++static DRIVER_ATTR(spirs, S_IWUSR | S_IRUGO, locomospi_showspirs, locomospi_storespirs);
++
++/* MMC Card status */
++
++ssize_t locomospi_showpower(struct device_driver *drv, char *buf)
++{
++	return sprintf(buf, "%d\n", spidev->card_power);
++}
++
++ssize_t locomospi_storepower(struct device_driver *drv, const char *buf, size_t count)
++{
++	locomospi_power(simple_strtoul(buf, NULL, 10));
++	return count;
++}
++static DRIVER_ATTR(cardpower, S_IWUSR | S_IRUGO, locomospi_showpower, locomospi_storepower);
++
++ssize_t locomospi_detectcard(struct device_driver *drv, char *buf)
++{
++	return sprintf(buf, "%d\n",(locomo_gpio_read_level(spidev->ldev->dev.parent,LOCOMO_GPIO_CARD_DETECT)>0)?0:1);
++}
++static DRIVER_ATTR(carddetect, S_IRUGO, locomospi_detectcard, NULL);
++
++ssize_t locomospi_writeprotect(struct device_driver *drv, char *buf)
++{
++	return sprintf(buf, "%d\n",(locomo_gpio_read_level(spidev->ldev->dev.parent,LOCOMO_GPIO_WRITE_PROTECT)>0)?1:0);
++}
++static DRIVER_ATTR(cardwriteprotect, S_IRUGO, locomospi_writeprotect, NULL);
++
++ssize_t locomospi_showclockbase(struct device_driver *drv, char *buf)
++{
++	return sprintf(buf, "%d\n", spidev->clock_base);
++}
++
++ssize_t locomos%s
>>> DIFF TRUNCATED @ 16K






More information about the Openembedded-commits mailing list