Commit 3513f2e1 authored by Kevin Hilman's avatar Kevin Hilman

Merge branch 'davinci-backports'

parents b61dd8a7 c3767d47
...@@ -26,6 +26,7 @@ static LIST_HEAD(mtd_partitions); ...@@ -26,6 +26,7 @@ static LIST_HEAD(mtd_partitions);
struct mtd_part { struct mtd_part {
struct mtd_info mtd; struct mtd_info mtd;
struct mtd_info *master; struct mtd_info *master;
struct memory_accessor macc;
uint64_t offset; uint64_t offset;
struct list_head list; struct list_head list;
}; };
...@@ -327,6 +328,39 @@ int del_mtd_partitions(struct mtd_info *master) ...@@ -327,6 +328,39 @@ int del_mtd_partitions(struct mtd_info *master)
} }
EXPORT_SYMBOL(del_mtd_partitions); EXPORT_SYMBOL(del_mtd_partitions);
/*
* This lets other kernel code access the flash data. For example, it
* might hold a board's Ethernet address, or board-specific calibration
* data generated on the manufacturing floor.
*/
static ssize_t mtd_macc_read(struct memory_accessor *macc, char *buf,
off_t offset, size_t count)
{
struct mtd_part *part = container_of(macc, struct mtd_part, macc);
ssize_t ret = -EIO;
size_t retlen;
if (part_read((struct mtd_info *)part, offset, count,
&retlen, buf) == 0)
ret = retlen;
return ret;
}
static ssize_t mtd_macc_write(struct memory_accessor *macc, const char *buf,
off_t offset, size_t count)
{
struct mtd_part *part = container_of(macc, struct mtd_part, macc);
ssize_t ret = -EIO;
size_t retlen;
if (part_write((struct mtd_info *)part, offset, count,
&retlen, buf) == 0)
ret = retlen;
return ret;
}
static struct mtd_part *add_one_partition(struct mtd_info *master, static struct mtd_part *add_one_partition(struct mtd_info *master,
const struct mtd_partition *part, int partno, const struct mtd_partition *part, int partno,
uint64_t cur_offset) uint64_t cur_offset)
...@@ -364,6 +398,9 @@ static struct mtd_part *add_one_partition(struct mtd_info *master, ...@@ -364,6 +398,9 @@ static struct mtd_part *add_one_partition(struct mtd_info *master,
slave->mtd.read = part_read; slave->mtd.read = part_read;
slave->mtd.write = part_write; slave->mtd.write = part_write;
slave->macc.read = mtd_macc_read;
slave->macc.write = mtd_macc_write;
if (master->panic_write) if (master->panic_write)
slave->mtd.panic_write = part_panic_write; slave->mtd.panic_write = part_panic_write;
...@@ -428,6 +465,9 @@ static struct mtd_part *add_one_partition(struct mtd_info *master, ...@@ -428,6 +465,9 @@ static struct mtd_part *add_one_partition(struct mtd_info *master,
printk(KERN_NOTICE "0x%012llx-0x%012llx : \"%s\"\n", (unsigned long long)slave->offset, printk(KERN_NOTICE "0x%012llx-0x%012llx : \"%s\"\n", (unsigned long long)slave->offset,
(unsigned long long)(slave->offset + slave->mtd.size), slave->mtd.name); (unsigned long long)(slave->offset + slave->mtd.size), slave->mtd.name);
if (part->setup)
part->setup(&slave->macc, (void *)part->context);
/* let's do some sanity checks */ /* let's do some sanity checks */
if (slave->offset >= master->size) { if (slave->offset >= master->size) {
/* let's register it anyway to preserve ordering */ /* let's register it anyway to preserve ordering */
......
...@@ -2817,7 +2817,7 @@ static int __init davinci_emac_init(void) ...@@ -2817,7 +2817,7 @@ static int __init davinci_emac_init(void)
{ {
return platform_driver_register(&davinci_emac_driver); return platform_driver_register(&davinci_emac_driver);
} }
module_init(davinci_emac_init); late_initcall(davinci_emac_init);
/** /**
* davinci_emac_exit: EMAC driver module exit * davinci_emac_exit: EMAC driver module exit
......
...@@ -243,6 +243,7 @@ static unsigned char lcd_bits[LCD_PORTS][LCD_BITS][BIT_STATES]; ...@@ -243,6 +243,7 @@ static unsigned char lcd_bits[LCD_PORTS][LCD_BITS][BIT_STATES];
*/ */
#define LCD_PROTO_PARALLEL 0 #define LCD_PROTO_PARALLEL 0
#define LCD_PROTO_SERIAL 1 #define LCD_PROTO_SERIAL 1
#define LCD_PROTO_TI_DA8XX_LCD 2
/* /*
* LCD character sets * LCD character sets
...@@ -440,7 +441,8 @@ MODULE_PARM_DESC(lcd_type, ...@@ -440,7 +441,8 @@ MODULE_PARM_DESC(lcd_type,
static int lcd_proto = -1; static int lcd_proto = -1;
module_param(lcd_proto, int, 0000); module_param(lcd_proto, int, 0000);
MODULE_PARM_DESC(lcd_proto, "LCD communication: 0=parallel (//), 1=serial"); MODULE_PARM_DESC(lcd_proto, "LCD communication: 0=parallel (//), 1=serial,"
"2=TI LCD Interface");
static int lcd_charset = -1; static int lcd_charset = -1;
module_param(lcd_charset, int, 0000); module_param(lcd_charset, int, 0000);
...@@ -797,6 +799,26 @@ static void lcd_write_data_p8(int data) ...@@ -797,6 +799,26 @@ static void lcd_write_data_p8(int data)
spin_unlock(&pprt_lock); spin_unlock(&pprt_lock);
} }
/* send a command to the TI LCD panel */
static void lcd_write_cmd_tilcd(int cmd)
{
spin_lock(&pprt_lock);
/* present the data to the control port */
w_ctr(pprt, cmd);
udelay(60);
spin_unlock(&pprt_lock);
}
/* send data to the TI LCD panel */
static void lcd_write_data_tilcd(int data)
{
spin_lock(&pprt_lock);
/* present the data to the data port */
w_dtr(pprt, data);
udelay(60);
spin_unlock(&pprt_lock);
}
static void lcd_gotoxy(void) static void lcd_gotoxy(void)
{ {
lcd_write_cmd(0x80 /* set DDRAM address */ lcd_write_cmd(0x80 /* set DDRAM address */
...@@ -870,6 +892,26 @@ static void lcd_clear_fast_p8(void) ...@@ -870,6 +892,26 @@ static void lcd_clear_fast_p8(void)
lcd_gotoxy(); lcd_gotoxy();
} }
/* fills the display with spaces and resets X/Y */
static void lcd_clear_fast_tilcd(void)
{
int pos;
lcd_addr_x = lcd_addr_y = 0;
lcd_gotoxy();
spin_lock(&pprt_lock);
for (pos = 0; pos < lcd_height * lcd_hwidth; pos++) {
/* present the data to the data port */
w_dtr(pprt, ' ');
udelay(60);
}
spin_unlock(&pprt_lock);
lcd_addr_x = lcd_addr_y = 0;
lcd_gotoxy();
}
/* clears the display and resets X/Y */ /* clears the display and resets X/Y */
static void lcd_clear_display(void) static void lcd_clear_display(void)
{ {
...@@ -1396,7 +1438,7 @@ void lcd_init(void) ...@@ -1396,7 +1438,7 @@ void lcd_init(void)
if (lcd_da_pin == PIN_NOT_SET) if (lcd_da_pin == PIN_NOT_SET)
lcd_da_pin = DEFAULT_LCD_PIN_SDA; lcd_da_pin = DEFAULT_LCD_PIN_SDA;
} else { /* PARALLEL */ } else if (lcd_proto == LCD_PROTO_PARALLEL) { /* PARALLEL */
lcd_write_cmd = lcd_write_cmd_p8; lcd_write_cmd = lcd_write_cmd_p8;
lcd_write_data = lcd_write_data_p8; lcd_write_data = lcd_write_data_p8;
lcd_clear_fast = lcd_clear_fast_p8; lcd_clear_fast = lcd_clear_fast_p8;
...@@ -1407,6 +1449,10 @@ void lcd_init(void) ...@@ -1407,6 +1449,10 @@ void lcd_init(void)
lcd_rs_pin = DEFAULT_LCD_PIN_RS; lcd_rs_pin = DEFAULT_LCD_PIN_RS;
if (lcd_rw_pin == PIN_NOT_SET) if (lcd_rw_pin == PIN_NOT_SET)
lcd_rw_pin = DEFAULT_LCD_PIN_RW; lcd_rw_pin = DEFAULT_LCD_PIN_RW;
} else {
lcd_write_cmd = lcd_write_cmd_tilcd;
lcd_write_data = lcd_write_data_tilcd;
lcd_clear_fast = lcd_clear_fast_tilcd;
} }
if (lcd_bl_pin == PIN_NOT_SET) if (lcd_bl_pin == PIN_NOT_SET)
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#define MTD_PARTITIONS_H #define MTD_PARTITIONS_H
#include <linux/types.h> #include <linux/types.h>
#include <linux/memory.h>
/* /*
...@@ -40,6 +41,8 @@ struct mtd_partition { ...@@ -40,6 +41,8 @@ struct mtd_partition {
uint64_t offset; /* offset within the master MTD space */ uint64_t offset; /* offset within the master MTD space */
uint32_t mask_flags; /* master MTD flags to mask out for this partition */ uint32_t mask_flags; /* master MTD flags to mask out for this partition */
struct nand_ecclayout *ecclayout; /* out of band layout for this partition (NAND only)*/ struct nand_ecclayout *ecclayout; /* out of band layout for this partition (NAND only)*/
void (*setup)(struct memory_accessor *, void *context);
void *context;
}; };
#define MTDPART_OFS_NXTBLK (-2) #define MTDPART_OFS_NXTBLK (-2)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment