Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
41f7d7b3
Commit
41f7d7b3
authored
Sep 16, 2009
by
Stephen Rothwell
Browse files
Options
Browse Files
Download
Plain Diff
Merge commit 'backlight/for-mm'
parents
5cb5aed5
3b96ea9e
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
760 additions
and
2 deletions
+760
-2
drivers/video/backlight/Kconfig
drivers/video/backlight/Kconfig
+22
-0
drivers/video/backlight/Makefile
drivers/video/backlight/Makefile
+3
-1
drivers/video/backlight/adx_bl.c
drivers/video/backlight/adx_bl.c
+178
-0
drivers/video/backlight/hp680_bl.c
drivers/video/backlight/hp680_bl.c
+1
-1
drivers/video/backlight/lms283gf05.c
drivers/video/backlight/lms283gf05.c
+242
-0
drivers/video/backlight/mbp_nvidia_bl.c
drivers/video/backlight/mbp_nvidia_bl.c
+36
-0
drivers/video/backlight/wm831x_bl.c
drivers/video/backlight/wm831x_bl.c
+250
-0
include/linux/spi/lms283gf05.h
include/linux/spi/lms283gf05.h
+28
-0
No files found.
drivers/video/backlight/Kconfig
View file @
41f7d7b3
...
@@ -31,6 +31,13 @@ config LCD_CORGI
...
@@ -31,6 +31,13 @@ config LCD_CORGI
Say y here to support the LCD panels usually found on SHARP
Say y here to support the LCD panels usually found on SHARP
corgi (C7x0) and spitz (Cxx00) models.
corgi (C7x0) and spitz (Cxx00) models.
config LCD_LMS283GF05
tristate "Samsung LMS283GF05 LCD"
depends on LCD_CLASS_DEVICE && SPI_MASTER && GENERIC_GPIO
help
SPI driver for Samsung LMS283GF05. This provides basic support
for powering the LCD up/down through a sysfs interface.
config LCD_LTV350QV
config LCD_LTV350QV
tristate "Samsung LTV350QV LCD Panel"
tristate "Samsung LTV350QV LCD Panel"
depends on LCD_CLASS_DEVICE && SPI_MASTER
depends on LCD_CLASS_DEVICE && SPI_MASTER
...
@@ -229,3 +236,18 @@ config BACKLIGHT_SAHARA
...
@@ -229,3 +236,18 @@ config BACKLIGHT_SAHARA
help
help
If you have a Tabletkiosk Sahara Touch-iT, say y to enable the
If you have a Tabletkiosk Sahara Touch-iT, say y to enable the
backlight driver.
backlight driver.
config BACKLIGHT_WM831X
tristate "WM831x PMIC Backlight Driver"
depends on BACKLIGHT_CLASS_DEVICE && MFD_WM831X
help
If you have a backlight driven by the ISINK and DCDC of a
WM831x PMIC say y to enable the backlight driver for it.
config BACKLIGHT_ADX
tristate "Avionic Design Xanthos Backlight Driver"
depends on BACKLIGHT_CLASS_DEVICE && ARCH_PXA_ADX
default y
help
Say Y to enable the backlight driver on Avionic Design Xanthos-based
boards.
drivers/video/backlight/Makefile
View file @
41f7d7b3
...
@@ -3,6 +3,7 @@
...
@@ -3,6 +3,7 @@
obj-$(CONFIG_LCD_CLASS_DEVICE)
+=
lcd.o
obj-$(CONFIG_LCD_CLASS_DEVICE)
+=
lcd.o
obj-$(CONFIG_LCD_CORGI)
+=
corgi_lcd.o
obj-$(CONFIG_LCD_CORGI)
+=
corgi_lcd.o
obj-$(CONFIG_LCD_HP700)
+=
jornada720_lcd.o
obj-$(CONFIG_LCD_HP700)
+=
jornada720_lcd.o
obj-$(CONFIG_LCD_LMS283GF05)
+=
lms283gf05.o
obj-$(CONFIG_LCD_LTV350QV)
+=
ltv350qv.o
obj-$(CONFIG_LCD_LTV350QV)
+=
ltv350qv.o
obj-$(CONFIG_LCD_ILI9320)
+=
ili9320.o
obj-$(CONFIG_LCD_ILI9320)
+=
ili9320.o
obj-$(CONFIG_LCD_PLATFORM)
+=
platform_lcd.o
obj-$(CONFIG_LCD_PLATFORM)
+=
platform_lcd.o
...
@@ -24,4 +25,5 @@ obj-$(CONFIG_BACKLIGHT_DA903X) += da903x_bl.o
...
@@ -24,4 +25,5 @@ obj-$(CONFIG_BACKLIGHT_DA903X) += da903x_bl.o
obj-$(CONFIG_BACKLIGHT_MBP_NVIDIA)
+=
mbp_nvidia_bl.o
obj-$(CONFIG_BACKLIGHT_MBP_NVIDIA)
+=
mbp_nvidia_bl.o
obj-$(CONFIG_BACKLIGHT_TOSA)
+=
tosa_bl.o
obj-$(CONFIG_BACKLIGHT_TOSA)
+=
tosa_bl.o
obj-$(CONFIG_BACKLIGHT_SAHARA)
+=
kb3886_bl.o
obj-$(CONFIG_BACKLIGHT_SAHARA)
+=
kb3886_bl.o
obj-$(CONFIG_BACKLIGHT_WM831X)
+=
wm831x_bl.o
obj-$(CONFIG_BACKLIGHT_ADX)
+=
adx_bl.o
drivers/video/backlight/adx_bl.c
0 → 100644
View file @
41f7d7b3
/*
* linux/drivers/video/backlight/adx.c
*
* Copyright (C) 2009 Avionic Design GmbH
*
* 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.
*
* Written by Thierry Reding <thierry.reding@avionic-design.de>
*/
#include <linux/backlight.h>
#include <linux/fb.h>
#include <linux/io.h>
#include <linux/module.h>
#include <linux/platform_device.h>
/* register definitions */
#define ADX_BACKLIGHT_CONTROL 0x00
#define ADX_BACKLIGHT_CONTROL_ENABLE (1 << 0)
#define ADX_BACKLIGHT_BRIGHTNESS 0x08
#define ADX_BACKLIGHT_STATUS 0x10
#define ADX_BACKLIGHT_ERROR 0x18
struct
adxbl
{
void
__iomem
*
base
;
};
static
int
adx_backlight_update_status
(
struct
backlight_device
*
bldev
)
{
struct
adxbl
*
bl
=
bl_get_data
(
bldev
);
u32
value
;
value
=
bldev
->
props
.
brightness
;
writel
(
value
,
bl
->
base
+
ADX_BACKLIGHT_BRIGHTNESS
);
value
=
readl
(
bl
->
base
+
ADX_BACKLIGHT_CONTROL
);
if
(
bldev
->
props
.
state
&
BL_CORE_FBBLANK
)
value
&=
~
ADX_BACKLIGHT_CONTROL_ENABLE
;
else
value
|=
ADX_BACKLIGHT_CONTROL_ENABLE
;
writel
(
value
,
bl
->
base
+
ADX_BACKLIGHT_CONTROL
);
return
0
;
}
static
int
adx_backlight_get_brightness
(
struct
backlight_device
*
bldev
)
{
struct
adxbl
*
bl
=
bl_get_data
(
bldev
);
u32
brightness
;
brightness
=
readl
(
bl
->
base
+
ADX_BACKLIGHT_BRIGHTNESS
);
return
brightness
&
0xff
;
}
static
int
adx_backlight_check_fb
(
struct
fb_info
*
fb
)
{
return
1
;
}
static
struct
backlight_ops
adx_backlight_ops
=
{
.
options
=
0
,
.
update_status
=
adx_backlight_update_status
,
.
get_brightness
=
adx_backlight_get_brightness
,
.
check_fb
=
adx_backlight_check_fb
,
};
static
int
__devinit
adx_backlight_probe
(
struct
platform_device
*
pdev
)
{
struct
backlight_device
*
bldev
;
struct
resource
*
res
;
struct
adxbl
*
bl
;
int
ret
=
0
;
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
if
(
!
res
)
{
ret
=
-
ENXIO
;
goto
out
;
}
res
=
devm_request_mem_region
(
&
pdev
->
dev
,
res
->
start
,
resource_size
(
res
),
res
->
name
);
if
(
!
res
)
{
ret
=
-
ENXIO
;
goto
out
;
}
bl
=
devm_kzalloc
(
&
pdev
->
dev
,
sizeof
(
*
bl
),
GFP_KERNEL
);
if
(
!
bl
)
{
ret
=
-
ENOMEM
;
goto
out
;
}
bl
->
base
=
devm_ioremap_nocache
(
&
pdev
->
dev
,
res
->
start
,
resource_size
(
res
));
if
(
!
bl
->
base
)
{
ret
=
-
ENXIO
;
goto
out
;
}
bldev
=
backlight_device_register
(
dev_name
(
&
pdev
->
dev
),
&
pdev
->
dev
,
bl
,
&
adx_backlight_ops
);
if
(
!
bldev
)
{
ret
=
-
ENOMEM
;
goto
out
;
}
bldev
->
props
.
max_brightness
=
0xff
;
bldev
->
props
.
brightness
=
0xff
;
bldev
->
props
.
power
=
FB_BLANK_UNBLANK
;
platform_set_drvdata
(
pdev
,
bldev
);
out:
return
ret
;
}
static
int
__devexit
adx_backlight_remove
(
struct
platform_device
*
pdev
)
{
struct
backlight_device
*
bldev
;
int
ret
=
0
;
bldev
=
platform_get_drvdata
(
pdev
);
bldev
->
props
.
power
=
FB_BLANK_UNBLANK
;
bldev
->
props
.
brightness
=
0xff
;
backlight_update_status
(
bldev
);
backlight_device_unregister
(
bldev
);
platform_set_drvdata
(
pdev
,
NULL
);
return
ret
;
}
#ifdef CONFIG_PM
static
int
adx_backlight_suspend
(
struct
platform_device
*
pdev
,
pm_message_t
state
)
{
return
0
;
}
static
int
adx_backlight_resume
(
struct
platform_device
*
pdev
)
{
return
0
;
}
#else
#define adx_backlight_suspend NULL
#define adx_backlight_resume NULL
#endif
static
struct
platform_driver
adx_backlight_driver
=
{
.
probe
=
adx_backlight_probe
,
.
remove
=
__devexit_p
(
adx_backlight_remove
),
.
suspend
=
adx_backlight_suspend
,
.
resume
=
adx_backlight_resume
,
.
driver
=
{
.
name
=
"adx-backlight"
,
.
owner
=
THIS_MODULE
,
},
};
static
int
__init
adx_backlight_init
(
void
)
{
return
platform_driver_register
(
&
adx_backlight_driver
);
}
static
void
__exit
adx_backlight_exit
(
void
)
{
platform_driver_unregister
(
&
adx_backlight_driver
);
}
module_init
(
adx_backlight_init
);
module_exit
(
adx_backlight_exit
);
MODULE_AUTHOR
(
"Thierry Reding <thierry.reding@avionic-design.de>"
);
MODULE_DESCRIPTION
(
"Avionic Design Xanthos Backlight Driver"
);
MODULE_LICENSE
(
"GPL v2"
);
drivers/video/backlight/hp680_bl.c
View file @
41f7d7b3
...
@@ -103,7 +103,7 @@ static struct backlight_ops hp680bl_ops = {
...
@@ -103,7 +103,7 @@ static struct backlight_ops hp680bl_ops = {
.
update_status
=
hp680bl_set_intensity
,
.
update_status
=
hp680bl_set_intensity
,
};
};
static
int
__init
hp680bl_probe
(
struct
platform_device
*
pdev
)
static
int
__
dev
init
hp680bl_probe
(
struct
platform_device
*
pdev
)
{
{
struct
backlight_device
*
bd
;
struct
backlight_device
*
bd
;
...
...
drivers/video/backlight/lms283gf05.c
0 → 100644
View file @
41f7d7b3
/*
* lms283gf05.c -- support for Samsung LMS283GF05 LCD
*
* Copyright (c) 2009 Marek Vasut <marek.vasut@gmail.com>
*
* 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.
*/
#include <linux/device.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/gpio.h>
#include <linux/lcd.h>
#include <linux/spi/spi.h>
#include <linux/spi/lms283gf05.h>
struct
lms283gf05_state
{
struct
spi_device
*
spi
;
struct
lcd_device
*
ld
;
};
struct
lms283gf05_seq
{
unsigned
char
reg
;
unsigned
short
value
;
unsigned
char
delay
;
};
/* Magic sequences supplied by manufacturer, for details refer to datasheet */
static
struct
lms283gf05_seq
disp_initseq
[]
=
{
/* REG, VALUE, DELAY */
{
0x07
,
0x0000
,
0
},
{
0x13
,
0x0000
,
10
},
{
0x11
,
0x3004
,
0
},
{
0x14
,
0x200F
,
0
},
{
0x10
,
0x1a20
,
0
},
{
0x13
,
0x0040
,
50
},
{
0x13
,
0x0060
,
0
},
{
0x13
,
0x0070
,
200
},
{
0x01
,
0x0127
,
0
},
{
0x02
,
0x0700
,
0
},
{
0x03
,
0x1030
,
0
},
{
0x08
,
0x0208
,
0
},
{
0x0B
,
0x0620
,
0
},
{
0x0C
,
0x0110
,
0
},
{
0x30
,
0x0120
,
0
},
{
0x31
,
0x0127
,
0
},
{
0x32
,
0x0000
,
0
},
{
0x33
,
0x0503
,
0
},
{
0x34
,
0x0727
,
0
},
{
0x35
,
0x0124
,
0
},
{
0x36
,
0x0706
,
0
},
{
0x37
,
0x0701
,
0
},
{
0x38
,
0x0F00
,
0
},
{
0x39
,
0x0F00
,
0
},
{
0x40
,
0x0000
,
0
},
{
0x41
,
0x0000
,
0
},
{
0x42
,
0x013f
,
0
},
{
0x43
,
0x0000
,
0
},
{
0x44
,
0x013f
,
0
},
{
0x45
,
0x0000
,
0
},
{
0x46
,
0xef00
,
0
},
{
0x47
,
0x013f
,
0
},
{
0x48
,
0x0000
,
0
},
{
0x07
,
0x0015
,
30
},
{
0x07
,
0x0017
,
0
},
{
0x20
,
0x0000
,
0
},
{
0x21
,
0x0000
,
0
},
{
0x22
,
0x0000
,
0
}
};
static
struct
lms283gf05_seq
disp_pdwnseq
[]
=
{
{
0x07
,
0x0016
,
30
},
{
0x07
,
0x0004
,
0
},
{
0x10
,
0x0220
,
20
},
{
0x13
,
0x0060
,
50
},
{
0x13
,
0x0040
,
50
},
{
0x13
,
0x0000
,
0
},
{
0x10
,
0x0000
,
0
}
};
static
void
lms283gf05_reset
(
unsigned
long
gpio
,
bool
inverted
)
{
gpio_set_value
(
gpio
,
!
inverted
);
mdelay
(
100
);
gpio_set_value
(
gpio
,
inverted
);
mdelay
(
20
);
gpio_set_value
(
gpio
,
!
inverted
);
mdelay
(
20
);
}
static
void
lms283gf05_toggle
(
struct
spi_device
*
spi
,
struct
lms283gf05_seq
*
seq
,
int
sz
)
{
char
buf
[
3
];
int
i
;
for
(
i
=
0
;
i
<
sz
;
i
++
)
{
buf
[
0
]
=
0x74
;
buf
[
1
]
=
0x00
;
buf
[
2
]
=
seq
[
i
].
reg
;
spi_write
(
spi
,
buf
,
3
);
buf
[
0
]
=
0x76
;
buf
[
1
]
=
seq
[
i
].
value
>>
8
;
buf
[
2
]
=
seq
[
i
].
value
&
0xff
;
spi_write
(
spi
,
buf
,
3
);
mdelay
(
seq
[
i
].
delay
);
}
}
static
int
lms283gf05_power_set
(
struct
lcd_device
*
ld
,
int
power
)
{
struct
lms283gf05_state
*
st
=
lcd_get_data
(
ld
);
struct
spi_device
*
spi
=
st
->
spi
;
struct
lms283gf05_pdata
*
pdata
=
spi
->
dev
.
platform_data
;
if
(
power
)
{
if
(
pdata
)
lms283gf05_reset
(
pdata
->
reset_gpio
,
pdata
->
reset_inverted
);
lms283gf05_toggle
(
spi
,
disp_initseq
,
ARRAY_SIZE
(
disp_initseq
));
}
else
{
lms283gf05_toggle
(
spi
,
disp_pdwnseq
,
ARRAY_SIZE
(
disp_pdwnseq
));
if
(
pdata
)
gpio_set_value
(
pdata
->
reset_gpio
,
pdata
->
reset_inverted
);
}
return
0
;
}
static
struct
lcd_ops
lms_ops
=
{
.
set_power
=
lms283gf05_power_set
,
.
get_power
=
NULL
,
};
static
int
__devinit
lms283gf05_probe
(
struct
spi_device
*
spi
)
{
struct
lms283gf05_state
*
st
;
struct
lms283gf05_pdata
*
pdata
=
spi
->
dev
.
platform_data
;
struct
lcd_device
*
ld
;
int
ret
=
0
;
if
(
pdata
!=
NULL
)
{
ret
=
gpio_request
(
pdata
->
reset_gpio
,
"LMS285GF05 RESET"
);
if
(
ret
)
return
ret
;
ret
=
gpio_direction_output
(
pdata
->
reset_gpio
,
!
pdata
->
reset_inverted
);
if
(
ret
)
goto
err
;
}
st
=
kzalloc
(
sizeof
(
struct
lms283gf05_state
),
GFP_KERNEL
);
if
(
st
==
NULL
)
{
dev_err
(
&
spi
->
dev
,
"No memory for device state
\n
"
);
ret
=
-
ENOMEM
;
goto
err
;
}
ld
=
lcd_device_register
(
"lms283gf05"
,
&
spi
->
dev
,
st
,
&
lms_ops
);
if
(
IS_ERR
(
ld
))
{
ret
=
PTR_ERR
(
ld
);
goto
err2
;
}
st
->
spi
=
spi
;
st
->
ld
=
ld
;
dev_set_drvdata
(
&
spi
->
dev
,
st
);
/* kick in the LCD */
if
(
pdata
)
lms283gf05_reset
(
pdata
->
reset_gpio
,
pdata
->
reset_inverted
);
lms283gf05_toggle
(
spi
,
disp_initseq
,
ARRAY_SIZE
(
disp_initseq
));
return
0
;
err2:
kfree
(
st
);
err:
if
(
pdata
!=
NULL
)
gpio_free
(
pdata
->
reset_gpio
);
return
ret
;
}
static
int
__devexit
lms283gf05_remove
(
struct
spi_device
*
spi
)
{
struct
lms283gf05_state
*
st
=
dev_get_drvdata
(
&
spi
->
dev
);
struct
lms283gf05_pdata
*
pdata
=
st
->
spi
->
dev
.
platform_data
;
lcd_device_unregister
(
st
->
ld
);
if
(
pdata
!=
NULL
)
gpio_free
(
pdata
->
reset_gpio
);
kfree
(
st
);
return
0
;
}
static
struct
spi_driver
lms283gf05_driver
=
{
.
driver
=
{
.
name
=
"lms283gf05"
,
.
owner
=
THIS_MODULE
,
},
.
probe
=
lms283gf05_probe
,
.
remove
=
__devexit_p
(
lms283gf05_remove
),
};
static
__init
int
lms283gf05_init
(
void
)
{
return
spi_register_driver
(
&
lms283gf05_driver
);
}
static
__exit
void
lms283gf05_exit
(
void
)
{
spi_unregister_driver
(
&
lms283gf05_driver
);
}
module_init
(
lms283gf05_init
);
module_exit
(
lms283gf05_exit
);
MODULE_AUTHOR
(
"Marek Vasut <marek.vasut@gmail.com>"
);
MODULE_DESCRIPTION
(
"LCD283GF05 LCD"
);
MODULE_LICENSE
(
"GPL v2"
);
drivers/video/backlight/mbp_nvidia_bl.c
View file @
41f7d7b3
...
@@ -164,6 +164,15 @@ static const struct dmi_system_id __initdata mbp_device_table[] = {
...
@@ -164,6 +164,15 @@ static const struct dmi_system_id __initdata mbp_device_table[] = {
},
},
.
driver_data
=
(
void
*
)
&
intel_chipset_data
,
.
driver_data
=
(
void
*
)
&
intel_chipset_data
,
},
},
{
.
callback
=
mbp_dmi_match
,
.
ident
=
"MacBookAir 1,1"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Apple Inc."
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"MacBookAir1,1"
),
},
.
driver_data
=
(
void
*
)
&
intel_chipset_data
,
},
{
{
.
callback
=
mbp_dmi_match
,
.
callback
=
mbp_dmi_match
,
.
ident
=
"MacBook 5,1"
,
.
ident
=
"MacBook 5,1"
,
...
@@ -173,6 +182,15 @@ static const struct dmi_system_id __initdata mbp_device_table[] = {
...
@@ -173,6 +182,15 @@ static const struct dmi_system_id __initdata mbp_device_table[] = {
},
},
.
driver_data
=
(
void
*
)
&
nvidia_chipset_data
,
.
driver_data
=
(
void
*
)
&
nvidia_chipset_data
,
},
},
{
.
callback
=
mbp_dmi_match
,
.
ident
=
"MacBook 5,2"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Apple Inc."
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"MacBook5,2"
),
},
.
driver_data
=
(
void
*
)
&
nvidia_chipset_data
,
},
{
{
.
callback
=
mbp_dmi_match
,
.
callback
=
mbp_dmi_match
,
.
ident
=
"MacBookAir 2,1"
,
.
ident
=
"MacBookAir 2,1"
,
...
@@ -191,6 +209,24 @@ static const struct dmi_system_id __initdata mbp_device_table[] = {
...
@@ -191,6 +209,24 @@ static const struct dmi_system_id __initdata mbp_device_table[] = {
},
},
.
driver_data
=
(
void
*
)
&
nvidia_chipset_data
,
.
driver_data
=
(
void
*
)
&
nvidia_chipset_data
,
},
},
{
.
callback
=
mbp_dmi_match
,
.
ident
=
"MacBookPro 5,2"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Apple Inc."
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"MacBookPro5,2"
),
},
.
driver_data
=
(
void
*
)
&
nvidia_chipset_data
,
},
{
.
callback
=
mbp_dmi_match
,
.
ident
=
"MacBookPro 5,5"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Apple Inc."
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"MacBookPro5,5"
),
},
.
driver_data
=
(
void
*
)
&
nvidia_chipset_data
,
},
{
}
{
}
};
};
...
...
drivers/video/backlight/wm831x_bl.c
0 → 100644
View file @
41f7d7b3
/*
* Backlight driver for Wolfson Microelectronics WM831x PMICs
*
* Copyright 2009 Wolfson Microelectonics plc
*
* 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.
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/fb.h>
#include <linux/backlight.h>
#include <linux/mfd/wm831x/core.h>
#include <linux/mfd/wm831x/pdata.h>
#include <linux/mfd/wm831x/regulator.h>
struct
wm831x_backlight_data
{
struct
wm831x
*
wm831x
;
int
isink_reg
;
int
current_brightness
;
};
static
int
wm831x_backlight_set
(
struct
backlight_device
*
bl
,
int
brightness
)
{
struct
wm831x_backlight_data
*
data
=
bl_get_data
(
bl
);
struct
wm831x
*
wm831x
=
data
->
wm831x
;
int
power_up
=
!
data
->
current_brightness
&&
brightness
;
int
power_down
=
data
->
current_brightness
&&
!
brightness
;
int
ret
;
if
(
power_up
)
{
/* Enable the ISINK */
ret
=
wm831x_set_bits
(
wm831x
,
data
->
isink_reg
,
WM831X_CS1_ENA
,
WM831X_CS1_ENA
);
if
(
ret
<
0
)
goto
err
;
/* Enable the DC-DC */
ret
=
wm831x_set_bits
(
wm831x
,
WM831X_DCDC_ENABLE
,
WM831X_DC4_ENA
,
WM831X_DC4_ENA
);
if
(
ret
<
0
)
goto
err
;
}
if
(
power_down
)
{
/* DCDC first */
ret
=
wm831x_set_bits
(
wm831x
,
WM831X_DCDC_ENABLE
,
WM831X_DC4_ENA
,
0
);
if
(
ret
<
0
)
goto
err
;
/* ISINK */
ret
=
wm831x_set_bits
(
wm831x
,
data
->
isink_reg
,
WM831X_CS1_DRIVE
|
WM831X_CS1_ENA
,
0
);
if
(
ret
<
0
)
goto
err
;
}
/* Set the new brightness */
ret
=
wm831x_set_bits
(
wm831x
,
data
->
isink_reg
,
WM831X_CS1_ISEL_MASK
,
brightness
);
if
(
ret
<
0
)
goto
err
;
if
(
power_up
)
{
/* Drive current through the ISINK */
ret
=
wm831x_set_bits
(
wm831x
,
data
->
isink_reg
,
WM831X_CS1_DRIVE
,
WM831X_CS1_DRIVE
);
if
(
ret
<
0
)
return
ret
;
}
data
->
current_brightness
=
brightness
;
return
0
;
err:
/* If we were in the middle of a power transition always shut down
* for safety.
*/
if
(
power_up
||
power_down
)
{
wm831x_set_bits
(
wm831x
,
WM831X_DCDC_ENABLE
,
WM831X_DC4_ENA
,
0
);
wm831x_set_bits
(
wm831x
,
data
->
isink_reg
,
WM831X_CS1_ENA
,
0
);
}
return
ret
;
}
static
int
wm831x_backlight_update_status
(
struct
backlight_device
*
bl
)
{
int
brightness
=
bl
->
props
.
brightness
;
if
(
bl
->
props
.
power
!=
FB_BLANK_UNBLANK
)
brightness
=
0
;
if
(
bl
->
props
.
fb_blank
!=
FB_BLANK_UNBLANK
)
brightness
=
0
;
if
(
bl
->
props
.
state
&
BL_CORE_SUSPENDED
)
brightness
=
0
;
return
wm831x_backlight_set
(
bl
,
brightness
);
}
static
int
wm831x_backlight_get_brightness
(
struct
backlight_device
*
bl
)
{
struct
wm831x_backlight_data
*
data
=
bl_get_data
(
bl
);
return
data
->
current_brightness
;
}
static
struct
backlight_ops
wm831x_backlight_ops
=
{
.
options
=
BL_CORE_SUSPENDRESUME
,
.
update_status
=
wm831x_backlight_update_status
,
.
get_brightness
=
wm831x_backlight_get_brightness
,
};
static
int
wm831x_backlight_probe
(
struct
platform_device
*
pdev
)
{
struct
wm831x
*
wm831x
=
dev_get_drvdata
(
pdev
->
dev
.
parent
);
struct
wm831x_pdata
*
wm831x_pdata
;
struct
wm831x_backlight_pdata
*
pdata
;
struct
wm831x_backlight_data
*
data
;
struct
backlight_device
*
bl
;
int
ret
,
i
,
max_isel
,
isink_reg
,
dcdc_cfg
;
/* We need platform data */
if
(
pdev
->
dev
.
parent
->
platform_data
)
{
wm831x_pdata
=
pdev
->
dev
.
parent
->
platform_data
;
pdata
=
wm831x_pdata
->
backlight
;
}
else
{
pdata
=
NULL
;
}
if
(
!
pdata
)
{
dev_err
(
&
pdev
->
dev
,
"No platform data supplied
\n
"
);
return
-
EINVAL
;
}
/* Figure out the maximum current we can use */
for
(
i
=
0
;
i
<
WM831X_ISINK_MAX_ISEL
;
i
++
)
{
if
(
wm831x_isinkv_values
[
i
]
>
pdata
->
max_uA
)
break
;
}
if
(
i
==
0
)
{
dev_err
(
&
pdev
->
dev
,
"Invalid max_uA: %duA
\n
"
,
pdata
->
max_uA
);
return
-
EINVAL
;
}
max_isel
=
i
-
1
;
if
(
pdata
->
max_uA
!=
wm831x_isinkv_values
[
max_isel
])
dev_warn
(
&
pdev
->
dev
,
"Maximum current is %duA not %duA as requested
\n
"
,
wm831x_isinkv_values
[
max_isel
],
pdata
->
max_uA
);
switch
(
pdata
->
isink
)
{
case
1
:
isink_reg
=
WM831X_CURRENT_SINK_1
;
dcdc_cfg
=
0
;
break
;
case
2
:
isink_reg
=
WM831X_CURRENT_SINK_2
;
dcdc_cfg
=
WM831X_DC4_FBSRC
;
break
;
default:
dev_err
(
&
pdev
->
dev
,
"Invalid ISINK %d
\n
"
,
pdata
->
isink
);
return
-
EINVAL
;
}
/* Configure the ISINK to use for feedback */
ret
=
wm831x_reg_unlock
(
wm831x
);
if
(
ret
<
0
)
return
ret
;
ret
=
wm831x_set_bits
(
wm831x
,
WM831X_DC4_CONTROL
,
WM831X_DC4_FBSRC
,
dcdc_cfg
);
wm831x_reg_lock
(
wm831x
);
if
(
ret
<
0
)
return
ret
;
data
=
kzalloc
(
sizeof
(
*
data
),
GFP_KERNEL
);
if
(
data
==
NULL
)
return
-
ENOMEM
;
data
->
wm831x
=
wm831x
;
data
->
current_brightness
=
0
;
data
->
isink_reg
=
isink_reg
;
bl
=
backlight_device_register
(
"wm831x"
,
&
pdev
->
dev
,
data
,
&
wm831x_backlight_ops
);
if
(
IS_ERR
(
bl
))
{
dev_err
(
&
pdev
->
dev
,
"failed to register backlight
\n
"
);
kfree
(
data
);
return
PTR_ERR
(
bl
);
}
bl
->
props
.
max_brightness
=
max_isel
;
bl
->
props
.
brightness
=
max_isel
;
platform_set_drvdata
(
pdev
,
bl
);
/* Disable the DCDC if it was started so we can bootstrap */
wm831x_set_bits
(
wm831x
,
WM831X_DCDC_ENABLE
,
WM831X_DC4_ENA
,
0
);
backlight_update_status
(
bl
);
return
0
;
}
static
int
wm831x_backlight_remove
(
struct
platform_device
*
pdev
)
{
struct
backlight_device
*
bl
=
platform_get_drvdata
(
pdev
);
struct
wm831x_backlight_data
*
data
=
bl_get_data
(
bl
);
backlight_device_unregister
(
bl
);
kfree
(
data
);
return
0
;
}
static
struct
platform_driver
wm831x_backlight_driver
=
{
.
driver
=
{
.
name
=
"wm831x-backlight"
,
.
owner
=
THIS_MODULE
,
},
.
probe
=
wm831x_backlight_probe
,
.
remove
=
wm831x_backlight_remove
,
};
static
int
__init
wm831x_backlight_init
(
void
)
{
return
platform_driver_register
(
&
wm831x_backlight_driver
);
}
module_init
(
wm831x_backlight_init
);
static
void
__exit
wm831x_backlight_exit
(
void
)
{
platform_driver_unregister
(
&
wm831x_backlight_driver
);
}
module_exit
(
wm831x_backlight_exit
);
MODULE_DESCRIPTION
(
"Backlight Driver for WM831x PMICs"
);
MODULE_AUTHOR
(
"Mark Brown <broonie@opensource.wolfsonmicro.com"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_ALIAS
(
"platform:wm831x-backlight"
);
include/linux/spi/lms283gf05.h
0 → 100644
View file @
41f7d7b3
/*
* lms283gf05.h - Platform glue for Samsung LMS283GF05 LCD
*
* Copyright (C) 2009 Marek Vasut <marek.vasut@gmail.com>
*
* 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 program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef _INCLUDE_LINUX_SPI_LMS283GF05_H_
#define _INCLUDE_LINUX_SPI_LMS283GF05_H_
struct
lms283gf05_pdata
{
unsigned
long
reset_gpio
;
bool
reset_inverted
;
};
#endif
/* _INCLUDE_LINUX_SPI_LMS283GF05_H_ */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment