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
16fa935a
Commit
16fa935a
authored
May 13, 2010
by
Kevin Hilman
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'davinci-upstream-accepted' into davinci-reset
parents
b57f95a3
bb59c752
Changes
12
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
1037 additions
and
250 deletions
+1037
-250
arch/arm/mach-davinci/board-da850-evm.c
arch/arm/mach-davinci/board-da850-evm.c
+18
-1
arch/arm/mach-davinci/include/mach/mmc.h
arch/arm/mach-davinci/include/mach/mmc.h
+3
-0
drivers/input/touchscreen/Kconfig
drivers/input/touchscreen/Kconfig
+13
-0
drivers/input/touchscreen/Makefile
drivers/input/touchscreen/Makefile
+1
-0
drivers/input/touchscreen/tps6507x-ts.c
drivers/input/touchscreen/tps6507x-ts.c
+400
-0
drivers/mfd/Kconfig
drivers/mfd/Kconfig
+12
-0
drivers/mfd/Makefile
drivers/mfd/Makefile
+2
-1
drivers/mfd/tps6507x.c
drivers/mfd/tps6507x.c
+158
-0
drivers/mmc/host/davinci_mmc.c
drivers/mmc/host/davinci_mmc.c
+76
-36
drivers/regulator/tps6507x-regulator.c
drivers/regulator/tps6507x-regulator.c
+161
-212
include/linux/input/tps6507x-ts.h
include/linux/input/tps6507x-ts.h
+24
-0
include/linux/mfd/tps6507x.h
include/linux/mfd/tps6507x.h
+169
-0
No files found.
arch/arm/mach-davinci/board-da850-evm.c
View file @
16fa935a
...
...
@@ -17,6 +17,7 @@
#include <linux/i2c.h>
#include <linux/i2c/at24.h>
#include <linux/i2c/pca953x.h>
#include <linux/mfd/tps6507x.h>
#include <linux/gpio.h>
#include <linux/platform_device.h>
#include <linux/mtd/mtd.h>
...
...
@@ -24,6 +25,8 @@
#include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>
#include <linux/regulator/machine.h>
#include <linux/mfd/tps6507x.h>
#include <linux/input/tps6507x-ts.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
...
...
@@ -533,10 +536,24 @@ struct regulator_init_data tps65070_regulator_data[] = {
},
};
static
struct
touchscreen_init_data
tps6507x_touchscreen_data
=
{
.
poll_period
=
30
,
/* ms between touch samples */
.
min_pressure
=
0x30
,
/* minimum pressure to trigger touch */
.
vref
=
0
,
/* turn off vref when not using A/D */
.
vendor
=
0
,
/* /sys/class/input/input?/id/vendor */
.
product
=
65070
,
/* /sys/class/input/input?/id/product */
.
version
=
0x100
,
/* /sys/class/input/input?/id/version */
};
static
struct
tps6507x_board
tps_board
=
{
.
tps6507x_pmic_init_data
=
&
tps65070_regulator_data
[
0
],
.
tps6507x_ts_init_data
=
&
tps6507x_touchscreen_data
,
};
static
struct
i2c_board_info
__initdata
da850evm_tps65070_info
[]
=
{
{
I2C_BOARD_INFO
(
"tps6507x"
,
0x48
),
.
platform_data
=
&
tps
65070_regulator_data
[
0
]
,
.
platform_data
=
&
tps
_board
,
},
};
...
...
arch/arm/mach-davinci/include/mach/mmc.h
View file @
16fa935a
...
...
@@ -22,6 +22,9 @@ struct davinci_mmc_config {
/* Version of the MMC/SD controller */
u8
version
;
/* Number of sg segments */
u8
nr_sg
;
};
void
davinci_setup_mmc
(
int
module
,
struct
davinci_mmc_config
*
config
);
...
...
drivers/input/touchscreen/Kconfig
View file @
16fa935a
...
...
@@ -594,4 +594,17 @@ config TOUCHSCREEN_PCAP
To compile this driver as a module, choose M here: the
module will be called pcap_ts.
config TOUCHSCREEN_TPS6507X
tristate "TPS6507x based touchscreens"
depends on I2C
help
Say Y here if you have a TPS6507x based touchscreen
controller.
If unsure, say N.
To compile this driver as a module, choose M here: the
module will be called tps6507x_ts.
endif
drivers/input/touchscreen/Makefile
View file @
16fa935a
...
...
@@ -46,3 +46,4 @@ obj-$(CONFIG_TOUCHSCREEN_WM97XX_ATMEL) += atmel-wm97xx.o
obj-$(CONFIG_TOUCHSCREEN_WM97XX_MAINSTONE)
+=
mainstone-wm97xx.o
obj-$(CONFIG_TOUCHSCREEN_WM97XX_ZYLONITE)
+=
zylonite-wm97xx.o
obj-$(CONFIG_TOUCHSCREEN_W90X900)
+=
w90p910_ts.o
obj-$(CONFIG_TOUCHSCREEN_TPS6507X)
+=
tps6507x-ts.o
drivers/input/touchscreen/tps6507x-ts.c
0 → 100644
View file @
16fa935a
/*
* drivers/input/touchscreen/tps6507x_ts.c
*
* Touchscreen driver for the tps6507x chip.
*
* Copyright (c) 2009 RidgeRun (todd.fischer@ridgerun.com)
*
* Credits:
*
* Using code from tsc2007, MtekVision Co., Ltd.
*
* For licencing details see kernel-base/COPYING
*
* TPS65070, TPS65073, TPS650731, and TPS650732 support
* 10 bit touch screen interface.
*/
#include <linux/module.h>
#include <linux/workqueue.h>
#include <linux/slab.h>
#include <linux/input.h>
#include <linux/platform_device.h>
#include <linux/mfd/tps6507x.h>
#include <linux/input/tps6507x-ts.h>
#include <linux/delay.h>
#define TSC_DEFAULT_POLL_PERIOD 30
/* ms */
#define TPS_DEFAULT_MIN_PRESSURE 0x30
#define MAX_10BIT ((1 << 10) - 1)
#define TPS6507X_ADCONFIG_CONVERT_TS (TPS6507X_ADCONFIG_AD_ENABLE | \
TPS6507X_ADCONFIG_START_CONVERSION | \
TPS6507X_ADCONFIG_INPUT_REAL_TSC)
#define TPS6507X_ADCONFIG_POWER_DOWN_TS (TPS6507X_ADCONFIG_INPUT_REAL_TSC)
struct
ts_event
{
u16
x
;
u16
y
;
u16
pressure
;
};
struct
tps6507x_ts
{
struct
input_dev
*
input_dev
;
struct
device
*
dev
;
char
phys
[
32
];
struct
workqueue_struct
*
wq
;
struct
delayed_work
work
;
unsigned
polling
;
/* polling is active */
struct
ts_event
tc
;
struct
tps6507x_dev
*
mfd
;
u16
model
;
unsigned
pendown
;
int
irq
;
void
(
*
clear_penirq
)(
void
);
unsigned
long
poll_period
;
/* ms */
u16
min_pressure
;
int
vref
;
/* non-zero to leave vref on */
};
static
int
tps6507x_read_u8
(
struct
tps6507x_ts
*
tsc
,
u8
reg
,
u8
*
data
)
{
int
err
;
err
=
tsc
->
mfd
->
read_dev
(
tsc
->
mfd
,
reg
,
1
,
data
);
if
(
err
)
return
err
;
return
0
;
}
static
int
tps6507x_write_u8
(
struct
tps6507x_ts
*
tsc
,
u8
reg
,
u8
data
)
{
return
tsc
->
mfd
->
write_dev
(
tsc
->
mfd
,
reg
,
1
,
&
data
);
}
static
s32
tps6507x_adc_conversion
(
struct
tps6507x_ts
*
tsc
,
u8
tsc_mode
,
u16
*
value
)
{
s32
ret
;
u8
adc_status
;
u8
result
;
/* Route input signal to A/D converter */
ret
=
tps6507x_write_u8
(
tsc
,
TPS6507X_REG_TSCMODE
,
tsc_mode
);
if
(
ret
)
{
dev_err
(
tsc
->
dev
,
"TSC mode read failed
\n
"
);
goto
err
;
}
/* Start A/D conversion */
ret
=
tps6507x_write_u8
(
tsc
,
TPS6507X_REG_ADCONFIG
,
TPS6507X_ADCONFIG_CONVERT_TS
);
if
(
ret
)
{
dev_err
(
tsc
->
dev
,
"ADC config write failed
\n
"
);
return
ret
;
}
do
{
ret
=
tps6507x_read_u8
(
tsc
,
TPS6507X_REG_ADCONFIG
,
&
adc_status
);
if
(
ret
)
{
dev_err
(
tsc
->
dev
,
"ADC config read failed
\n
"
);
goto
err
;
}
}
while
(
adc_status
&
TPS6507X_ADCONFIG_START_CONVERSION
);
ret
=
tps6507x_read_u8
(
tsc
,
TPS6507X_REG_ADRESULT_2
,
&
result
);
if
(
ret
)
{
dev_err
(
tsc
->
dev
,
"ADC result 2 read failed
\n
"
);
goto
err
;
}
*
value
=
(
result
&
TPS6507X_REG_ADRESULT_2_MASK
)
<<
8
;
ret
=
tps6507x_read_u8
(
tsc
,
TPS6507X_REG_ADRESULT_1
,
&
result
);
if
(
ret
)
{
dev_err
(
tsc
->
dev
,
"ADC result 1 read failed
\n
"
);
goto
err
;
}
*
value
|=
result
;
dev_dbg
(
tsc
->
dev
,
"TSC channel %d = 0x%X
\n
"
,
tsc_mode
,
*
value
);
err:
return
ret
;
}
/* Need to call tps6507x_adc_standby() after using A/D converter for the
* touch screen interrupt to work properly.
*/
static
s32
tps6507x_adc_standby
(
struct
tps6507x_ts
*
tsc
)
{
s32
ret
;
s32
loops
=
0
;
u8
val
;
ret
=
tps6507x_write_u8
(
tsc
,
TPS6507X_REG_ADCONFIG
,
TPS6507X_ADCONFIG_INPUT_TSC
);
if
(
ret
)
return
ret
;
ret
=
tps6507x_write_u8
(
tsc
,
TPS6507X_REG_TSCMODE
,
TPS6507X_TSCMODE_STANDBY
);
if
(
ret
)
return
ret
;
ret
=
tps6507x_read_u8
(
tsc
,
TPS6507X_REG_INT
,
&
val
);
if
(
ret
)
return
ret
;
while
(
val
&
TPS6507X_REG_TSC_INT
)
{
mdelay
(
10
);
ret
=
tps6507x_read_u8
(
tsc
,
TPS6507X_REG_INT
,
&
val
);
if
(
ret
)
return
ret
;
loops
++
;
}
return
ret
;
}
static
void
tps6507x_ts_handler
(
struct
work_struct
*
work
)
{
struct
tps6507x_ts
*
tsc
=
container_of
(
work
,
struct
tps6507x_ts
,
work
.
work
);
struct
input_dev
*
input_dev
=
tsc
->
input_dev
;
int
pendown
;
int
schd
;
int
poll
=
0
;
s32
ret
;
ret
=
tps6507x_adc_conversion
(
tsc
,
TPS6507X_TSCMODE_PRESSURE
,
&
tsc
->
tc
.
pressure
);
if
(
ret
)
goto
done
;
pendown
=
tsc
->
tc
.
pressure
>
tsc
->
min_pressure
;
if
(
unlikely
(
!
pendown
&&
tsc
->
pendown
))
{
dev_dbg
(
tsc
->
dev
,
"UP
\n
"
);
input_report_key
(
input_dev
,
BTN_TOUCH
,
0
);
input_report_abs
(
input_dev
,
ABS_PRESSURE
,
0
);
input_sync
(
input_dev
);
tsc
->
pendown
=
0
;
}
if
(
pendown
)
{
if
(
!
tsc
->
pendown
)
{
dev_dbg
(
tsc
->
dev
,
"DOWN
\n
"
);
input_report_key
(
input_dev
,
BTN_TOUCH
,
1
);
}
else
dev_dbg
(
tsc
->
dev
,
"still down
\n
"
);
ret
=
tps6507x_adc_conversion
(
tsc
,
TPS6507X_TSCMODE_X_POSITION
,
&
tsc
->
tc
.
x
);
if
(
ret
)
goto
done
;
ret
=
tps6507x_adc_conversion
(
tsc
,
TPS6507X_TSCMODE_Y_POSITION
,
&
tsc
->
tc
.
y
);
if
(
ret
)
goto
done
;
input_report_abs
(
input_dev
,
ABS_X
,
tsc
->
tc
.
x
);
input_report_abs
(
input_dev
,
ABS_Y
,
tsc
->
tc
.
y
);
input_report_abs
(
input_dev
,
ABS_PRESSURE
,
tsc
->
tc
.
pressure
);
input_sync
(
input_dev
);
tsc
->
pendown
=
1
;
poll
=
1
;
}
done:
/* always poll if not using interrupts */
poll
=
1
;
if
(
poll
)
{
schd
=
queue_delayed_work
(
tsc
->
wq
,
&
tsc
->
work
,
tsc
->
poll_period
*
HZ
/
1000
);
if
(
schd
)
tsc
->
polling
=
1
;
else
{
tsc
->
polling
=
0
;
dev_err
(
tsc
->
dev
,
"re-schedule failed"
);
}
}
else
tsc
->
polling
=
0
;
ret
=
tps6507x_adc_standby
(
tsc
);
}
static
int
tps6507x_ts_probe
(
struct
platform_device
*
pdev
)
{
int
error
;
struct
tps6507x_ts
*
tsc
;
struct
tps6507x_dev
*
tps6507x_dev
=
dev_get_drvdata
(
pdev
->
dev
.
parent
);
struct
touchscreen_init_data
*
init_data
;
struct
input_dev
*
input_dev
;
struct
tps6507x_board
*
tps_board
;
int
schd
;
/**
* tps_board points to pmic related constants
* coming from the board-evm file.
*/
tps_board
=
(
struct
tps6507x_board
*
)
tps6507x_dev
->
dev
->
platform_data
;
if
(
!
tps_board
)
{
dev_err
(
tps6507x_dev
->
dev
,
"Could not find tps6507x platform data
\n
"
);
return
-
EIO
;
}
/**
* init_data points to array of regulator_init structures
* coming from the board-evm file.
*/
init_data
=
tps_board
->
tps6507x_ts_init_data
;
tsc
=
kzalloc
(
sizeof
(
struct
tps6507x_ts
),
GFP_KERNEL
);
if
(
!
tsc
)
{
dev_err
(
tps6507x_dev
->
dev
,
"failed to allocate driver data
\n
"
);
error
=
-
ENOMEM
;
goto
err0
;
}
tps6507x_dev
->
ts
=
tsc
;
tsc
->
mfd
=
tps6507x_dev
;
tsc
->
dev
=
tps6507x_dev
->
dev
;
input_dev
=
input_allocate_device
();
if
(
!
input_dev
)
{
dev_err
(
tsc
->
dev
,
"Failed to allocate input device.
\n
"
);
error
=
-
ENOMEM
;
goto
err1
;
}
input_dev
->
evbit
[
0
]
=
BIT_MASK
(
EV_KEY
)
|
BIT_MASK
(
EV_ABS
);
input_dev
->
keybit
[
BIT_WORD
(
BTN_TOUCH
)]
=
BIT_MASK
(
BTN_TOUCH
);
input_set_abs_params
(
input_dev
,
ABS_X
,
0
,
MAX_10BIT
,
0
,
0
);
input_set_abs_params
(
input_dev
,
ABS_Y
,
0
,
MAX_10BIT
,
0
,
0
);
input_set_abs_params
(
input_dev
,
ABS_PRESSURE
,
0
,
MAX_10BIT
,
0
,
0
);
input_dev
->
name
=
"TPS6507x Touchscreen"
;
input_dev
->
id
.
bustype
=
BUS_I2C
;
input_dev
->
dev
.
parent
=
tsc
->
dev
;
snprintf
(
tsc
->
phys
,
sizeof
(
tsc
->
phys
),
"%s/input0"
,
dev_name
(
tsc
->
dev
));
input_dev
->
phys
=
tsc
->
phys
;
dev_dbg
(
tsc
->
dev
,
"device: %s
\n
"
,
input_dev
->
phys
);
input_set_drvdata
(
input_dev
,
tsc
);
tsc
->
input_dev
=
input_dev
;
INIT_DELAYED_WORK
(
&
tsc
->
work
,
tps6507x_ts_handler
);
tsc
->
wq
=
create_workqueue
(
"TPS6507x Touchscreen"
);
if
(
init_data
)
{
tsc
->
poll_period
=
init_data
->
poll_period
;
tsc
->
vref
=
init_data
->
vref
;
tsc
->
min_pressure
=
init_data
->
min_pressure
;
input_dev
->
id
.
vendor
=
init_data
->
vendor
;
input_dev
->
id
.
product
=
init_data
->
product
;
input_dev
->
id
.
version
=
init_data
->
version
;
}
else
{
tsc
->
poll_period
=
TSC_DEFAULT_POLL_PERIOD
;
tsc
->
min_pressure
=
TPS_DEFAULT_MIN_PRESSURE
;
}
error
=
tps6507x_adc_standby
(
tsc
);
if
(
error
)
goto
err2
;
error
=
input_register_device
(
input_dev
);
if
(
error
)
goto
err2
;
schd
=
queue_delayed_work
(
tsc
->
wq
,
&
tsc
->
work
,
tsc
->
poll_period
*
HZ
/
1000
);
if
(
schd
)
tsc
->
polling
=
1
;
else
{
tsc
->
polling
=
0
;
dev_err
(
tsc
->
dev
,
"schedule failed"
);
goto
err2
;
}
return
0
;
err2:
cancel_delayed_work
(
&
tsc
->
work
);
flush_workqueue
(
tsc
->
wq
);
destroy_workqueue
(
tsc
->
wq
);
tsc
->
wq
=
0
;
input_free_device
(
input_dev
);
err1:
kfree
(
tsc
);
tps6507x_dev
->
ts
=
NULL
;
err0:
return
error
;
}
static
int
__devexit
tps6507x_ts_remove
(
struct
platform_device
*
pdev
)
{
struct
tps6507x_dev
*
tps6507x_dev
=
platform_get_drvdata
(
pdev
);
struct
tps6507x_ts
*
tsc
=
tps6507x_dev
->
ts
;
struct
input_dev
*
input_dev
=
tsc
->
input_dev
;
if
(
!
tsc
)
return
0
;
cancel_delayed_work
(
&
tsc
->
work
);
flush_workqueue
(
tsc
->
wq
);
destroy_workqueue
(
tsc
->
wq
);
tsc
->
wq
=
0
;
input_free_device
(
input_dev
);
tps6507x_dev
->
ts
=
NULL
;
kfree
(
tsc
);
return
0
;
}
static
struct
platform_driver
tps6507x_ts_driver
=
{
.
driver
=
{
.
name
=
"tps6507x-ts"
,
.
owner
=
THIS_MODULE
,
},
.
probe
=
tps6507x_ts_probe
,
.
remove
=
__devexit_p
(
tps6507x_ts_remove
),
};
static
int
__init
tps6507x_ts_init
(
void
)
{
return
platform_driver_register
(
&
tps6507x_ts_driver
);
}
module_init
(
tps6507x_ts_init
);
static
void
__exit
tps6507x_ts_exit
(
void
)
{
platform_driver_unregister
(
&
tps6507x_ts_driver
);
}
module_exit
(
tps6507x_ts_exit
);
MODULE_AUTHOR
(
"Todd Fischer <todd.fischer@ridgerun.com>"
);
MODULE_DESCRIPTION
(
"TPS6507x - TouchScreen driver"
);
MODULE_LICENSE
(
"GPL v2"
);
MODULE_ALIAS
(
"platform:tps6507x-tsc"
);
drivers/mfd/Kconfig
View file @
16fa935a
...
...
@@ -111,6 +111,18 @@ config TPS65010
This driver can also be built as a module. If so, the module
will be called tps65010.
config TPS6507X
tristate "TPS6507x Power Management / Touch Screen chips"
select MFD_CORE
depends on I2C
help
If you say yes here you get support for the TPS6507x series of
Power Management / Touch Screen chips. These include voltage
regulators, lithium ion/polymer battery charging, touch screen
and other features that are often used in portable devices.
This driver can also be built as a module. If so, the module
will be called tps6507x.
config MENELAUS
bool "Texas Instruments TWL92330/Menelaus PM chip"
depends on I2C=y && ARCH_OMAP2
...
...
drivers/mfd/Makefile
View file @
16fa935a
...
...
@@ -28,6 +28,7 @@ obj-$(CONFIG_MFD_WM8350_I2C) += wm8350-i2c.o
obj-$(CONFIG_MFD_WM8994)
+=
wm8994-core.o
obj-$(CONFIG_TPS65010)
+=
tps65010.o
obj-$(CONFIG_TPS6507X)
+=
tps6507x.o
obj-$(CONFIG_MENELAUS)
+=
menelaus.o
obj-$(CONFIG_TWL4030_CORE)
+=
twl-core.o twl4030-irq.o twl6030-irq.o
...
...
@@ -62,4 +63,4 @@ obj-$(CONFIG_AB3100_OTP) += ab3100-otp.o
obj-$(CONFIG_AB4500_CORE)
+=
ab4500-core.o
obj-$(CONFIG_MFD_TIMBERDALE)
+=
timberdale.o
obj-$(CONFIG_PMIC_ADP5520)
+=
adp5520.o
obj-$(CONFIG_LPC_SCH)
+=
lpc_sch.o
\ No newline at end of file
obj-$(CONFIG_LPC_SCH)
+=
lpc_sch.o
drivers/mfd/tps6507x.c
0 → 100644
View file @
16fa935a
/*
* tps6507x.c -- TPS6507x chip family multi-function driver
*
* Copyright (c) 2010 RidgeRun (todd.fischer@ridgerun.com)
*
* Author: Todd Fischer
* todd.fischer@ridgerun.com
*
* Credits:
*
* Using code from wm831x-*.c, wm8400-core, Wolfson Microelectronics PLC.
*
* For licencing details see kernel-base/COPYING
*
*/
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/i2c.h>
#include <linux/mfd/core.h>
#include <linux/mfd/tps6507x.h>
static
struct
mfd_cell
tps6507x_devs
[]
=
{
{
.
name
=
"tps6507x-pmic"
,
},
{
.
name
=
"tps6507x-ts"
,
},
};
static
int
tps6507x_i2c_read_device
(
struct
tps6507x_dev
*
tps6507x
,
char
reg
,
int
bytes
,
void
*
dest
)
{
struct
i2c_client
*
i2c
=
tps6507x
->
i2c_client
;
struct
i2c_msg
xfer
[
2
];
int
ret
;
/* Write register */
xfer
[
0
].
addr
=
i2c
->
addr
;
xfer
[
0
].
flags
=
0
;
xfer
[
0
].
len
=
1
;
xfer
[
0
].
buf
=
&
reg
;
/* Read data */
xfer
[
1
].
addr
=
i2c
->
addr
;
xfer
[
1
].
flags
=
I2C_M_RD
;
xfer
[
1
].
len
=
bytes
;
xfer
[
1
].
buf
=
dest
;
ret
=
i2c_transfer
(
i2c
->
adapter
,
xfer
,
2
);
if
(
ret
==
2
)
ret
=
0
;
else
if
(
ret
>=
0
)
ret
=
-
EIO
;
return
ret
;
}
static
int
tps6507x_i2c_write_device
(
struct
tps6507x_dev
*
tps6507x
,
char
reg
,
int
bytes
,
void
*
src
)
{
struct
i2c_client
*
i2c
=
tps6507x
->
i2c_client
;
/* we add 1 byte for device register */
u8
msg
[
TPS6507X_MAX_REGISTER
+
1
];
int
ret
;
if
(
bytes
>
(
TPS6507X_MAX_REGISTER
+
1
))
return
-
EINVAL
;
msg
[
0
]
=
reg
;
memcpy
(
&
msg
[
1
],
src
,
bytes
);
ret
=
i2c_master_send
(
i2c
,
msg
,
bytes
+
1
);
if
(
ret
<
0
)
return
ret
;
if
(
ret
!=
bytes
+
1
)
return
-
EIO
;
return
0
;
}
static
int
tps6507x_i2c_probe
(
struct
i2c_client
*
i2c
,
const
struct
i2c_device_id
*
id
)
{
struct
tps6507x_dev
*
tps6507x
;
int
ret
=
0
;
tps6507x
=
kzalloc
(
sizeof
(
struct
tps6507x_dev
),
GFP_KERNEL
);
if
(
tps6507x
==
NULL
)
{
kfree
(
i2c
);
return
-
ENOMEM
;
}
i2c_set_clientdata
(
i2c
,
tps6507x
);
tps6507x
->
dev
=
&
i2c
->
dev
;
tps6507x
->
i2c_client
=
i2c
;
tps6507x
->
read_dev
=
tps6507x_i2c_read_device
;
tps6507x
->
write_dev
=
tps6507x_i2c_write_device
;
ret
=
mfd_add_devices
(
tps6507x
->
dev
,
-
1
,
tps6507x_devs
,
ARRAY_SIZE
(
tps6507x_devs
),
NULL
,
0
);
if
(
ret
<
0
)
goto
err
;
return
ret
;
err:
mfd_remove_devices
(
tps6507x
->
dev
);
kfree
(
tps6507x
);
return
ret
;
}
static
int
tps6507x_i2c_remove
(
struct
i2c_client
*
i2c
)
{
struct
tps6507x_dev
*
tps6507x
=
i2c_get_clientdata
(
i2c
);
mfd_remove_devices
(
tps6507x
->
dev
);
kfree
(
tps6507x
);
return
0
;
}
static
const
struct
i2c_device_id
tps6507x_i2c_id
[]
=
{
{
"tps6507x"
,
0
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
tps6507x_i2c_id
);
static
struct
i2c_driver
tps6507x_i2c_driver
=
{
.
driver
=
{
.
name
=
"tps6507x"
,
.
owner
=
THIS_MODULE
,
},
.
probe
=
tps6507x_i2c_probe
,
.
remove
=
tps6507x_i2c_remove
,
.
id_table
=
tps6507x_i2c_id
,
};
static
int
__init
tps6507x_i2c_init
(
void
)
{
return
i2c_add_driver
(
&
tps6507x_i2c_driver
);
}
/* init early so consumer devices can complete system boot */
subsys_initcall
(
tps6507x_i2c_init
);
static
void
__exit
tps6507x_i2c_exit
(
void
)
{
i2c_del_driver
(
&
tps6507x_i2c_driver
);
}
module_exit
(
tps6507x_i2c_exit
);
MODULE_DESCRIPTION
(
"TPS6507x chip family multi-function driver"
);
MODULE_LICENSE
(
"GPL"
);
drivers/mmc/host/davinci_mmc.c
View file @
16fa935a
...
...
@@ -137,15 +137,15 @@
/*
* One scatterlist dma "segment" is at most MAX_CCNT rw_threshold units,
* and we handle up to NR_SG segments. MMC_BLOCK_BOUNCE kicks in only
* and we handle up to
MAX_
NR_SG segments. MMC_BLOCK_BOUNCE kicks in only
* for drivers with max_hw_segs == 1, making the segments bigger (64KB)
* than the page or two that's otherwise typical.
NR_SG == 16 gives at
*
least the same throughput boost, using EDMA transfer linkage instead
* of spending CPU time copying pages.
* than the page or two that's otherwise typical.
nr_sg (passed from
*
platform data) == 16 gives at least the same throughput boost, using
*
EDMA transfer linkage instead
of spending CPU time copying pages.
*/
#define MAX_CCNT ((1 << 16) - 1)
#define
NR_SG
16
#define
MAX_NR_SG
16
static
unsigned
rw_threshold
=
32
;
module_param
(
rw_threshold
,
uint
,
S_IRUGO
);
...
...
@@ -171,6 +171,7 @@ struct mmc_davinci_host {
#define DAVINCI_MMC_DATADIR_READ 1
#define DAVINCI_MMC_DATADIR_WRITE 2
unsigned
char
data_dir
;
unsigned
char
suspended
;
/* buffer is used during PIO of one scatterlist segment, and
* is updated along with buffer_bytes_left. bytes_left applies
...
...
@@ -192,7 +193,7 @@ struct mmc_davinci_host {
struct
edmacc_param
tx_template
;
struct
edmacc_param
rx_template
;
unsigned
n_link
;
u32
links
[
NR_SG
-
1
];
u32
links
[
MAX_
NR_SG
-
1
];
/* For PIO we walk scatterlists one segment at a time. */
unsigned
int
sg_len
;
...
...
@@ -202,6 +203,8 @@ struct mmc_davinci_host {
u8
version
;
/* for ns in one cycle calculation */
unsigned
ns_in_one_cycle
;
/* Number of sg segments */
u8
nr_sg
;
#ifdef CONFIG_CPU_FREQ
struct
notifier_block
freq_transition
;
#endif
...
...
@@ -568,6 +571,7 @@ davinci_release_dma_channels(struct mmc_davinci_host *host)
static
int
__init
davinci_acquire_dma_channels
(
struct
mmc_davinci_host
*
host
)
{
u32
link_size
;
int
r
,
i
;
/* Acquire master DMA write channel */
...
...
@@ -593,7 +597,8 @@ static int __init davinci_acquire_dma_channels(struct mmc_davinci_host *host)
/* Allocate parameter RAM slots, which will later be bound to a
* channel as needed to handle a scatterlist.
*/
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
host
->
links
);
i
++
)
{
link_size
=
min_t
(
unsigned
,
host
->
nr_sg
,
ARRAY_SIZE
(
host
->
links
));
for
(
i
=
0
;
i
<
link_size
;
i
++
)
{
r
=
edma_alloc_slot
(
EDMA_CTLR
(
host
->
txdma
),
EDMA_SLOT_ANY
);
if
(
r
<
0
)
{
dev_dbg
(
mmc_dev
(
host
->
mmc
),
"dma PaRAM alloc --> %d
\n
"
,
...
...
@@ -905,19 +910,26 @@ static void mmc_davinci_cmd_done(struct mmc_davinci_host *host,
}
}
static
void
davinci_abort_data
(
struct
mmc_davinci_host
*
host
,
struct
mmc_data
*
data
)
static
inline
void
mmc_davinci_reset_ctrl
(
struct
mmc_davinci_host
*
host
,
int
val
)
{
u32
temp
;
/* reset command and data state machines */
temp
=
readl
(
host
->
base
+
DAVINCI_MMCCTL
);
writel
(
temp
|
MMCCTL_CMDRST
|
MMCCTL_DATRST
,
host
->
base
+
DAVINCI_MMCCTL
);
if
(
val
)
/* reset */
temp
|=
MMCCTL_CMDRST
|
MMCCTL_DATRST
;
else
/* enable */
temp
&=
~
(
MMCCTL_CMDRST
|
MMCCTL_DATRST
);
temp
&=
~
(
MMCCTL_CMDRST
|
MMCCTL_DATRST
);
udelay
(
10
);
writel
(
temp
,
host
->
base
+
DAVINCI_MMCCTL
);
udelay
(
10
);
}
static
void
davinci_abort_data
(
struct
mmc_davinci_host
*
host
,
struct
mmc_data
*
data
)
{
mmc_davinci_reset_ctrl
(
host
,
1
);
mmc_davinci_reset_ctrl
(
host
,
0
);
}
static
irqreturn_t
mmc_davinci_irq
(
int
irq
,
void
*
dev_id
)
...
...
@@ -1121,15 +1133,8 @@ static inline void mmc_davinci_cpufreq_deregister(struct mmc_davinci_host *host)
#endif
static
void
__init
init_mmcsd_host
(
struct
mmc_davinci_host
*
host
)
{
/* DAT line portion is diabled and in reset state */
writel
(
readl
(
host
->
base
+
DAVINCI_MMCCTL
)
|
MMCCTL_DATRST
,
host
->
base
+
DAVINCI_MMCCTL
);
/* CMD line portion is diabled and in reset state */
writel
(
readl
(
host
->
base
+
DAVINCI_MMCCTL
)
|
MMCCTL_CMDRST
,
host
->
base
+
DAVINCI_MMCCTL
);
udelay
(
10
);
mmc_davinci_reset_ctrl
(
host
,
1
);
writel
(
0
,
host
->
base
+
DAVINCI_MMCCLK
);
writel
(
MMCCLK_CLKEN
,
host
->
base
+
DAVINCI_MMCCLK
);
...
...
@@ -1137,12 +1142,7 @@ static void __init init_mmcsd_host(struct mmc_davinci_host *host)
writel
(
0x1FFF
,
host
->
base
+
DAVINCI_MMCTOR
);
writel
(
0xFFFF
,
host
->
base
+
DAVINCI_MMCTOD
);
writel
(
readl
(
host
->
base
+
DAVINCI_MMCCTL
)
&
~
MMCCTL_DATRST
,
host
->
base
+
DAVINCI_MMCCTL
);
writel
(
readl
(
host
->
base
+
DAVINCI_MMCCTL
)
&
~
MMCCTL_CMDRST
,
host
->
base
+
DAVINCI_MMCCTL
);
udelay
(
10
);
mmc_davinci_reset_ctrl
(
host
,
0
);
}
static
int
__init
davinci_mmcsd_probe
(
struct
platform_device
*
pdev
)
...
...
@@ -1202,6 +1202,12 @@ static int __init davinci_mmcsd_probe(struct platform_device *pdev)
init_mmcsd_host
(
host
);
if
(
pdata
->
nr_sg
)
host
->
nr_sg
=
pdata
->
nr_sg
-
1
;
if
(
host
->
nr_sg
>
MAX_NR_SG
||
!
host
->
nr_sg
)
host
->
nr_sg
=
MAX_NR_SG
;
host
->
use_dma
=
use_dma
;
host
->
irq
=
irq
;
...
...
@@ -1327,32 +1333,66 @@ static int __exit davinci_mmcsd_remove(struct platform_device *pdev)
}
#ifdef CONFIG_PM
static
int
davinci_mmcsd_suspend
(
struct
platform_device
*
pdev
,
pm_message_t
msg
)
static
int
davinci_mmcsd_suspend
(
struct
device
*
dev
)
{
struct
platform_device
*
pdev
=
to_platform_device
(
dev
);
struct
mmc_davinci_host
*
host
=
platform_get_drvdata
(
pdev
);
struct
pm_message
msg
=
{
PM_EVENT_SUSPEND
};
int
ret
;
return
mmc_suspend_host
(
host
->
mmc
,
msg
);
mmc_host_enable
(
host
->
mmc
);
ret
=
mmc_suspend_host
(
host
->
mmc
,
msg
);
if
(
!
ret
)
{
writel
(
0
,
host
->
base
+
DAVINCI_MMCIM
);
mmc_davinci_reset_ctrl
(
host
,
1
);
mmc_host_disable
(
host
->
mmc
);
clk_disable
(
host
->
clk
);
host
->
suspended
=
1
;
}
else
{
host
->
suspended
=
0
;
mmc_host_disable
(
host
->
mmc
);
}
return
ret
;
}
static
int
davinci_mmcsd_resume
(
struct
platform_device
*
p
dev
)
static
int
davinci_mmcsd_resume
(
struct
device
*
dev
)
{
struct
platform_device
*
pdev
=
to_platform_device
(
dev
);
struct
mmc_davinci_host
*
host
=
platform_get_drvdata
(
pdev
);
int
ret
;
if
(
!
host
->
suspended
)
return
0
;
return
mmc_resume_host
(
host
->
mmc
);
clk_enable
(
host
->
clk
);
mmc_host_enable
(
host
->
mmc
);
mmc_davinci_reset_ctrl
(
host
,
0
);
ret
=
mmc_resume_host
(
host
->
mmc
);
if
(
!
ret
)
host
->
suspended
=
0
;
return
ret
;
}
static
struct
dev_pm_ops
davinci_mmcsd_pm
=
{
.
suspend
=
davinci_mmcsd_suspend
,
.
resume
=
davinci_mmcsd_resume
,
};
#define davinci_mmcsd_pm_ops (&davinci_mmcsd_pm)
#else
#define davinci_mmcsd_suspend NULL
#define davinci_mmcsd_resume NULL
#define davinci_mmcsd_pm_ops NULL
#endif
static
struct
platform_driver
davinci_mmcsd_driver
=
{
.
driver
=
{
.
name
=
"davinci_mmc"
,
.
owner
=
THIS_MODULE
,
.
pm
=
davinci_mmcsd_pm_ops
,
},
.
remove
=
__exit_p
(
davinci_mmcsd_remove
),
.
suspend
=
davinci_mmcsd_suspend
,
.
resume
=
davinci_mmcsd_resume
,
};
static
int
__init
davinci_mmcsd_init
(
void
)
...
...
drivers/regulator/tps6507x-regulator.c
View file @
16fa935a
This diff is collapsed.
Click to expand it.
include/linux/input/tps6507x-ts.h
0 → 100644
View file @
16fa935a
/* linux/i2c/tps6507x-ts.h
*
* Functions to access TPS65070 touch screen chip.
*
* Copyright (c) 2009 RidgeRun (todd.fischer@ridgerun.com)
*
*
* For licencing details see kernel-base/COPYING
*/
#ifndef __LINUX_I2C_TPS6507X_TS_H
#define __LINUX_I2C_TPS6507X_TS_H
/* Board specific touch screen initial values */
struct
touchscreen_init_data
{
int
poll_period
;
/* ms */
int
vref
;
/* non-zero to leave vref on */
__u16
min_pressure
;
/* min reading to be treated as a touch */
__u16
vendor
;
__u16
product
;
__u16
version
;
};
#endif
/* __LINUX_I2C_TPS6507X_TS_H */
include/linux/mfd/tps6507x.h
0 → 100644
View file @
16fa935a
/* linux/mfd/tps6507x.h
*
* Functions to access TPS65070 power management chip.
*
* Copyright (c) 2009 RidgeRun (todd.fischer@ridgerun.com)
*
*
* For licencing details see kernel-base/COPYING
*/
#ifndef __LINUX_MFD_TPS6507X_H
#define __LINUX_MFD_TPS6507X_H
/*
* ----------------------------------------------------------------------------
* Registers, all 8 bits
* ----------------------------------------------------------------------------
*/
/* Register definitions */
#define TPS6507X_REG_PPATH1 0X01
#define TPS6507X_CHG_USB BIT(7)
#define TPS6507X_CHG_AC BIT(6)
#define TPS6507X_CHG_USB_PW_ENABLE BIT(5)
#define TPS6507X_CHG_AC_PW_ENABLE BIT(4)
#define TPS6507X_CHG_AC_CURRENT BIT(2)
#define TPS6507X_CHG_USB_CURRENT BIT(0)
#define TPS6507X_REG_INT 0X02
#define TPS6507X_REG_MASK_AC_USB BIT(7)
#define TPS6507X_REG_MASK_TSC BIT(6)
#define TPS6507X_REG_MASK_PB_IN BIT(5)
#define TPS6507X_REG_TSC_INT BIT(3)
#define TPS6507X_REG_PB_IN_INT BIT(2)
#define TPS6507X_REG_AC_USB_APPLIED BIT(1)
#define TPS6507X_REG_AC_USB_REMOVED BIT(0)
#define TPS6507X_REG_CHGCONFIG0 0X03
#define TPS6507X_REG_CHGCONFIG1 0X04
#define TPS6507X_CON_CTRL1_DCDC1_ENABLE BIT(4)
#define TPS6507X_CON_CTRL1_DCDC2_ENABLE BIT(3)
#define TPS6507X_CON_CTRL1_DCDC3_ENABLE BIT(2)
#define TPS6507X_CON_CTRL1_LDO1_ENABLE BIT(1)
#define TPS6507X_CON_CTRL1_LDO2_ENABLE BIT(0)
#define TPS6507X_REG_CHGCONFIG2 0X05
#define TPS6507X_REG_CHGCONFIG3 0X06
#define TPS6507X_REG_ADCONFIG 0X07
#define TPS6507X_ADCONFIG_AD_ENABLE BIT(7)
#define TPS6507X_ADCONFIG_START_CONVERSION BIT(6)
#define TPS6507X_ADCONFIG_CONVERSION_DONE BIT(5)
#define TPS6507X_ADCONFIG_VREF_ENABLE BIT(4)
#define TPS6507X_ADCONFIG_INPUT_AD_IN1 0
#define TPS6507X_ADCONFIG_INPUT_AD_IN2 1
#define TPS6507X_ADCONFIG_INPUT_AD_IN3 2
#define TPS6507X_ADCONFIG_INPUT_AD_IN4 3
#define TPS6507X_ADCONFIG_INPUT_TS_PIN 4
#define TPS6507X_ADCONFIG_INPUT_BAT_CURRENT 5
#define TPS6507X_ADCONFIG_INPUT_AC_VOLTAGE 6
#define TPS6507X_ADCONFIG_INPUT_SYS_VOLTAGE 7
#define TPS6507X_ADCONFIG_INPUT_CHARGER_VOLTAGE 8
#define TPS6507X_ADCONFIG_INPUT_BAT_VOLTAGE 9
#define TPS6507X_ADCONFIG_INPUT_THRESHOLD_VOLTAGE 10
#define TPS6507X_ADCONFIG_INPUT_ISET1_VOLTAGE 11
#define TPS6507X_ADCONFIG_INPUT_ISET2_VOLTAGE 12
#define TPS6507X_ADCONFIG_INPUT_REAL_TSC 14
#define TPS6507X_ADCONFIG_INPUT_TSC 15
#define TPS6507X_REG_TSCMODE 0X08
#define TPS6507X_TSCMODE_X_POSITION 0
#define TPS6507X_TSCMODE_Y_POSITION 1
#define TPS6507X_TSCMODE_PRESSURE 2
#define TPS6507X_TSCMODE_X_PLATE 3
#define TPS6507X_TSCMODE_Y_PLATE 4
#define TPS6507X_TSCMODE_STANDBY 5
#define TPS6507X_TSCMODE_ADC_INPUT 6
#define TPS6507X_TSCMODE_DISABLE 7
#define TPS6507X_REG_ADRESULT_1 0X09
#define TPS6507X_REG_ADRESULT_2 0X0A
#define TPS6507X_REG_ADRESULT_2_MASK (BIT(1) | BIT(0))
#define TPS6507X_REG_PGOOD 0X0B
#define TPS6507X_REG_PGOODMASK 0X0C
#define TPS6507X_REG_CON_CTRL1 0X0D
#define TPS6507X_CON_CTRL1_DCDC1_ENABLE BIT(4)
#define TPS6507X_CON_CTRL1_DCDC2_ENABLE BIT(3)
#define TPS6507X_CON_CTRL1_DCDC3_ENABLE BIT(2)
#define TPS6507X_CON_CTRL1_LDO1_ENABLE BIT(1)
#define TPS6507X_CON_CTRL1_LDO2_ENABLE BIT(0)
#define TPS6507X_REG_CON_CTRL2 0X0E
#define TPS6507X_REG_CON_CTRL3 0X0F
#define TPS6507X_REG_DEFDCDC1 0X10
#define TPS6507X_DEFDCDC1_DCDC1_EXT_ADJ_EN BIT(7)
#define TPS6507X_DEFDCDC1_DCDC1_MASK 0X3F
#define TPS6507X_REG_DEFDCDC2_LOW 0X11
#define TPS6507X_DEFDCDC2_LOW_DCDC2_MASK 0X3F
#define TPS6507X_REG_DEFDCDC2_HIGH 0X12
#define TPS6507X_DEFDCDC2_HIGH_DCDC2_MASK 0X3F
#define TPS6507X_REG_DEFDCDC3_LOW 0X13
#define TPS6507X_DEFDCDC3_LOW_DCDC3_MASK 0X3F
#define TPS6507X_REG_DEFDCDC3_HIGH 0X14
#define TPS6507X_DEFDCDC3_HIGH_DCDC3_MASK 0X3F
#define TPS6507X_REG_DEFSLEW 0X15
#define TPS6507X_REG_LDO_CTRL1 0X16
#define TPS6507X_REG_LDO_CTRL1_LDO1_MASK 0X0F
#define TPS6507X_REG_DEFLDO2 0X17
#define TPS6507X_REG_DEFLDO2_LDO2_MASK 0X3F
#define TPS6507X_REG_WLED_CTRL1 0X18
#define TPS6507X_REG_WLED_CTRL2 0X19
/* VDCDC MASK */
#define TPS6507X_DEFDCDCX_DCDC_MASK 0X3F
#define TPS6507X_MAX_REGISTER 0X19
/**
* struct tps6507x_board - packages regulator and touchscreen init data
* @tps6507x_regulator_data: regulator initialization values
*
* Board data may be used to initialize regulator and touchscreen.
*/
struct
tps6507x_board
{
struct
regulator_init_data
*
tps6507x_pmic_init_data
;
struct
touchscreen_init_data
*
tps6507x_ts_init_data
;
};
/**
* struct tps6507x_dev - tps6507x sub-driver chip access routines
* @read_dev() - I2C register read function
* @write_dev() - I2C register write function
*
* Device data may be used to access the TPS6507x chip
*/
struct
tps6507x_dev
{
struct
device
*
dev
;
struct
i2c_client
*
i2c_client
;
int
(
*
read_dev
)(
struct
tps6507x_dev
*
tps6507x
,
char
reg
,
int
size
,
void
*
dest
);
int
(
*
write_dev
)(
struct
tps6507x_dev
*
tps6507x
,
char
reg
,
int
size
,
void
*
src
);
/* Client devices */
struct
tps6507x_pmic
*
pmic
;
struct
tps6507x_ts
*
ts
;
};
#endif
/* __LINUX_MFD_TPS6507X_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