diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
--- a/drivers/video/backlight/Makefile
+++ b/drivers/video/backlight/Makefile
@@ -3,3 +3,4 @@
obj-$(CONFIG_LCD_CLASS_DEVICE) += lcd.o
obj-$(CONFIG_BACKLIGHT_CLASS_DEVICE) += backlight.o
obj-$(CONFIG_BACKLIGHT_CORGI) += corgi_bl.o
+obj-$(CONFIG_SHARP_LOCOMO) += locomolcd.o
diff --git a/drivers/video/backlight/locomolcd.c b/drivers/video/backlight/locomolcd.c
new file mode 100644
--- /dev/null
+++ b/drivers/video/backlight/locomolcd.c
@@ -0,0 +1,156 @@
+/*
+ * Backlight control code for Sharp Zaurus SL-5500
+ *
+ * Copyright 2005 John Lenz <le...@cs.wisc.edu>
+ * GPL v2
+ *
+ */
+
+/* LCD power functions */
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/interrupt.h>
+
+#include <asm/hardware/locomo.h>
+#include <asm/irq.h>
+
+#ifdef CONFIG_SA1100_COLLIE
+#include <asm/arch/collie.h>
+#else
+#include <asm/arch/poodle.h>
+#endif
+
+extern void (*sa1100fb_lcd_power)(int on);
+
+static struct locomo_dev *locomolcd_dev = NULL;
+
+static void locomolcd_on(int comadj)
+{
+ locomo_gpio_set_dir(locomolcd_dev, LOCOMO_GPIO_LCD_VSHA_ON, 0);
+ locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_VSHA_ON, 1);
+ mdelay(2);
+
+ locomo_gpio_set_dir(locomolcd_dev, LOCOMO_GPIO_LCD_VSHD_ON, 0);
+ locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_VSHD_ON, 1);
+ mdelay(2);
+
+ locomo_m62332_senddata(locomolcd_dev, comadj, 0);
+ mdelay(5);
+
+ locomo_gpio_set_dir(locomolcd_dev, LOCOMO_GPIO_LCD_VEE_ON, 0);
+ locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_VEE_ON, 1);
+ mdelay(10);
+
+ /* TFTCRST | CPSOUT=0 | CPSEN */
+ locomo_writel(0x01, locomolcd_dev->mapbase + LOCOMO_TC);
+
+ /* Set CPSD */
+ locomo_writel(6, locomolcd_dev->mapbase + LOCOMO_CPSD);
+
+ /* TFTCRST | CPSOUT=0 | CPSEN */
+ locomo_writel((0x04 | 0x01), locomolcd_dev->mapbase + LOCOMO_TC);
+ mdelay(10);
+
+ locomo_gpio_set_dir(locomolcd_dev, LOCOMO_GPIO_LCD_MOD, 0);
+ locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_MOD, 1);
+}
+
+static void locomolcd_off(int comadj)
+{
+ /* TFTCRST=1 | CPSOUT=1 | CPSEN = 0 */
+ locomo_writel(0x06, locomolcd_dev->mapbase + LOCOMO_TC);
+ mdelay(1);
+
+ locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_VSHA_ON, 0);
+ mdelay(110);
+
+ locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_VEE_ON, 0);
+ mdelay(700);
+
+ /* TFTCRST=0 | CPSOUT=0 | CPSEN = 0 */
+ locomo_writel(0, locomolcd_dev->mapbase + LOCOMO_TC);
+ locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_MOD, 0);
+ locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_VSHD_ON, 0);
+}
+
+void locomolcd_power(int on)
+{
+ int comadj = 118;
+ unsigned long flags;
+
+ local_irq_save(flags);
+
+ if (!locomolcd_dev) {
+ local_irq_restore(flags);
+ return;
+ }
+
+ /* read comadj */
+#ifdef CONFIG_MACH_POODLE
+ comadj = 118;
+#else
+ comadj = 128;
+#endif
+
+ if (on)
+ locomolcd_on(comadj);
+ else
+ locomolcd_off(comadj);
+
+ local_irq_restore(flags);
+}
+EXPORT_SYMBOL(locomolcd_power);
+
+static int poodle_lcd_probe(struct locomo_dev *dev)
+{
+ unsigned long flags;
+
+ local_irq_save(flags);
+ locomolcd_dev = dev;
+
+ /* the poodle_lcd_power function is called for the first time
+ * from fs_initcall, which is before locomo is activated.
+ * We need to recall poodle_lcd_power here*/
+#ifdef CONFIG_MACH_POODLE
+ locomolcd_power(1);
+#endif
+ local_irq_restore(flags);
+ return 0;
+}
+
+static int poodle_lcd_remove(struct locomo_dev *dev)
+{
+ unsigned long flags;
+ local_irq_save(flags);
+ locomolcd_dev = NULL;
+ local_irq_restore(flags);
+ return 0;
+}
+
+static struct locomo_driver poodle_lcd_driver = {
+ .drv = {
+ .name = "locomo-backlight",
+ },
+ .devid = LOCOMO_DEVID_BACKLIGHT,
+ .probe = poodle_lcd_probe,
+ .remove = poodle_lcd_remove,
+};
+
+static int __init poodle_lcd_init(void)
+{
+ int ret;
+
+ ret = locomo_driver_register(&poodle_lcd_driver);
+ if (ret) return ret;
+
+#ifdef CONFIG_SA1100_COLLIE
+ sa1100fb_lcd_power = locomolcd_power;
+#endif
+
+ return 0;
+}
+device_initcall(poodle_lcd_init);
+
--
teflon -- maybe it is a trademark, but it should not be.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majo...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
I assume you have a new toy ;)
> PDA without
> screen is kind of useless, so it is quite important... I'll have to
> figure out how to really control the frontlight, because LCD without
> that is quite hard to read.
signed-off-by?
> @@ -0,0 +1,156 @@
> +/*
> + * Backlight control code for Sharp Zaurus SL-5500
> + *
> + * Copyright 2005 John Lenz <le...@cs.wisc.edu>
> + * GPL v2
Who is the maintainer for this stuff?
> +static struct locomo_dev *locomolcd_dev = NULL;
bah.
> +void locomolcd_power(int on)
> +{
> + int comadj = 118;
> + unsigned long flags;
> +
> + local_irq_save(flags);
What strange locking this driver uses. It appears to be assuming
uniprocessor, yes?
Signed-off-by: Pavel Machek <pa...@suse.cz>
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
--- a/drivers/video/backlight/Makefile
+++ b/drivers/video/backlight/Makefile
@@ -3,3 +3,4 @@
obj-$(CONFIG_LCD_CLASS_DEVICE) += lcd.o
obj-$(CONFIG_BACKLIGHT_CLASS_DEVICE) += backlight.o
obj-$(CONFIG_BACKLIGHT_CORGI) += corgi_bl.o
+obj-$(CONFIG_SHARP_LOCOMO) += locomolcd.o
diff --git a/drivers/video/backlight/locomolcd.c b/drivers/video/backlight/locomolcd.c
new file mode 100644
--- /dev/null
+++ b/drivers/video/backlight/locomolcd.c
@@ -0,0 +1,157 @@
+/*
+ * Backlight control code for Sharp Zaurus SL-5500
+ *
+ * Copyright 2005 John Lenz <le...@cs.wisc.edu>
+ * Maintainer: Pavel Machek <pa...@suse.cz> (unless John wants to :-)
+ * GPL v2
+ *
+ * This driver assumes single CPU. That's okay, because collie is
+ * slightly old hardware, and noone is going to retrofit second CPU to
+ * old PDA.
+ */
+
+/* LCD power functions */
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/interrupt.h>
+
+#include <asm/hardware/locomo.h>
+#include <asm/irq.h>
+
+#ifdef CONFIG_SA1100_COLLIE
+#include <asm/arch/collie.h>
+#else
+#include <asm/arch/poodle.h>
+#endif
+
+extern void (*sa1100fb_lcd_power)(int on);
+
+static struct locomo_dev *locomolcd_dev = NULL;
+void locomolcd_power(int on)
+{
+ int comadj = 118;
+ unsigned long flags;
+
+ local_irq_save(flags);
+
+ if (!locomolcd_dev) {
+ local_irq_restore(flags);
+ return;
+ }
+
+ /* read comadj */
+#ifdef CONFIG_MACH_POODLE
+ comadj = 118;
+#else
+ comadj = 128;
+#endif
+
+ if (on)
+ locomolcd_on(comadj);
+ else
+ locomolcd_off(comadj);
+
+ local_irq_restore(flags);
+}
+EXPORT_SYMBOL(locomolcd_power);
+
+static int poodle_lcd_probe(struct locomo_dev *dev)
+{
+ unsigned long flags;
+
+ local_irq_save(flags);
+ locomolcd_dev = dev;
+
+ /* the poodle_lcd_power function is called for the first time
+ * from fs_initcall, which is before locomo is activated.
+ * We need to recall poodle_lcd_power here*/
+#ifdef CONFIG_MACH_POODLE
+ locomolcd_power(1);
+#endif
+ local_irq_restore(flags);
+ return 0;
+}
+
+static int poodle_lcd_remove(struct locomo_dev *dev)
+{
+ unsigned long flags;
+ local_irq_save(flags);
+ locomolcd_dev = NULL;
+ local_irq_restore(flags);
+ return 0;
+}
+
+static struct locomo_driver poodle_lcd_driver = {
+ .drv = {
+ .name = "locomo-backlight",
+ },
+ .devid = LOCOMO_DEVID_BACKLIGHT,
+ .probe = poodle_lcd_probe,
+ .remove = poodle_lcd_remove,
+};
+
+static int __init poodle_lcd_init(void)
+{
+ int ret = locomo_driver_register(&poodle_lcd_driver);
+ if (ret) return ret;
+
+#ifdef CONFIG_SA1100_COLLIE
+ sa1100fb_lcd_power = locomolcd_power;
+#endif
+ return 0;
+}
+device_initcall(poodle_lcd_init);
+
--
teflon -- maybe it is a trademark, but it should not be.
> > This adds support for powering Zaurus's video up and down.
>
> I assume you have a new toy ;)
Actually very old toy, but I decided to make it working with 2.6
kernel (needed for bluetooth). Which is not quite an easy task.
> > PDA without
> > screen is kind of useless, so it is quite important... I'll have to
> > figure out how to really control the frontlight, because LCD without
> > that is quite hard to read.
>
> signed-off-by?
Sorry, will add.
> > @@ -0,0 +1,156 @@
> > +/*
> > + * Backlight control code for Sharp Zaurus SL-5500
> > + *
> > + * Copyright 2005 John Lenz <le...@cs.wisc.edu>
> > + * GPL v2
>
> Who is the maintainer for this stuff?
I guess I'll maintain in.
> > +static struct locomo_dev *locomolcd_dev = NULL;
>
> bah.
Well, sa1100fb_lcd_power is not provide us with void * we could use,
and by definition you only have one frontlight in a PDA, so that
should be okay...
> > +void locomolcd_power(int on)
> > +{
> > + int comadj = 118;
> > + unsigned long flags;
> > +
> > + local_irq_save(flags);
>
> What strange locking this driver uses. It appears to be assuming
> uniprocessor, yes?
Yes, and I guess that's okay: collie is slightly old hardware, and
noone is going to retrofit second CPU to old PDA.
Pavel
--
teflon -- maybe it is a trademark, but it should not be.
Can you go back to the Sharp source and confirm that these values should
be hardcoded in both the poodle and collie cases please? I know the
sharpsl_param code can provide them but I can't remember exactly which
models use which fields. I want to make sure this isn't a quick hack
John made before sharpsl_param was written :).
Thanks,
Richard
I'll do it.
> > > @@ -0,0 +1,156 @@
> > > +/*
> > > + * Backlight control code for Sharp Zaurus SL-5500
> > > + *
> > > + * Copyright 2005 John Lenz <le...@cs.wisc.edu>
> > > + * GPL v2
> >
> > Who is the maintainer for this stuff?
>
> I guess I'll maintain in.
>
> > > +static struct locomo_dev *locomolcd_dev = NULL;
> >
> > bah.
>
> Well, sa1100fb_lcd_power is not provide us with void * we could use,
> and by definition you only have one frontlight in a PDA, so that
> should be okay...
"bah" means "there's no need to initialise this to NULL".
> > > > +/*
> > > > + * Backlight control code for Sharp Zaurus SL-5500
> > > > + *
> > > > + * Copyright 2005 John Lenz <le...@cs.wisc.edu>
> > > > + * GPL v2
> > >
> > > Who is the maintainer for this stuff?
> >
> > I guess I'll maintain in.
> >
> > > > +static struct locomo_dev *locomolcd_dev = NULL;
> > >
> > > bah.
> >
> > Well, sa1100fb_lcd_power is not provide us with void * we could use,
> > and by definition you only have one frontlight in a PDA, so that
> > should be okay...
>
> "bah" means "there's no need to initialise this to NULL".
Okay, that's kind of easier to fix ;-). Done here, it will eventually
propagate.
Pavel
--
teflon -- maybe it is a trademark, but it should not be.
> > + /* read comadj */
> > +#ifdef CONFIG_MACH_POODLE
> > + comadj = 118;
> > +#else
> > + comadj = 128;
> > +#endif
>
> Can you go back to the Sharp source and confirm that these values should
> be hardcoded in both the poodle and collie cases please? I know the
> sharpsl_param code can provide them but I can't remember exactly which
> models use which fields. I want to make sure this isn't a quick hack
> John made before sharpsl_param was written :).
Sharp sources are a big mess (as usual), but reading it from
sharpsl_param seems to be okay for at least poodle. I'll read it for
collie, too, and see what happens... seems to work.
[Not for andrew, yet.]
Pavel
diff --git a/drivers/video/backlight/locomolcd.c b/drivers/video/backlight/locomolcd.c
--- a/drivers/video/backlight/locomolcd.c
+++ b/drivers/video/backlight/locomolcd.c
@@ -20,6 +20,7 @@
#include <asm/hardware/locomo.h>
#include <asm/irq.h>
+#include <asm/mach/sharpsl_param.h>
#ifdef CONFIG_SA1100_COLLIE
#include <asm/arch/collie.h>
@@ -29,7 +30,7 @@
extern void (*sa1100fb_lcd_power)(int on);
-static struct locomo_dev *locomolcd_dev = NULL;
+static struct locomo_dev *locomolcd_dev;
static void locomolcd_on(int comadj)
{
@@ -82,7 +83,7 @@ static void locomolcd_off(int comadj)
void locomolcd_power(int on)
{
- int comadj = 118;
+ int comadj = sharpsl_param.comadj;
unsigned long flags;
local_irq_save(flags);
@@ -93,11 +94,13 @@ void locomolcd_power(int on)
}
/* read comadj */
+ if (comadj == -1) {
#ifdef CONFIG_MACH_POODLE
- comadj = 118;
+ comadj = 118;
#else
- comadj = 128;
+ comadj = 128;
#endif
+ }
if (on)
locomolcd_on(comadj);
--
teflon -- maybe it is a trademark, but it should not be.
> >> + /* read comadj */
> >> +#ifdef CONFIG_MACH_POODLE
> >> + comadj = 118;
> >> +#else
> >> + comadj = 128;
> >> +#endif
> >
> > Can you go back to the Sharp source and confirm that these values should
> > be hardcoded in both the poodle and collie cases please? I know the
> > sharpsl_param code can provide them but I can't remember exactly which
> > models use which fields. I want to make sure this isn't a quick hack
> > John made before sharpsl_param was written :).
>
> No, those values were from the original sharp code... at some point I was
> going to investigate what values the sharpsl param stuff returned and see
> if those worked. If the sharpsl stuff works, then by all means use it.
I added code to read it from sharpsl, if it is not there, I use
defaults above. It seems to work on my collie.
Pavel
--
teflon -- maybe it is a trademark, but it should not be.
No, those values were from the original sharp code... at some point I was
going to investigate what values the sharpsl param stuff returned and see
if those worked. If the sharpsl stuff works, then by all means use it.
John