summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorRichard Zhu <r65037@freescale.com>2009-07-31 12:51:15 +0800
committerRob Herring <r.herring@freescale.com>2009-08-07 09:47:15 -0500
commitdafefa617ea7986a6409e85775ebddab7884f3b4 (patch)
treea44b67fb43b46e825a76b04e878f2166e713c7d8 /drivers
parentd3b4f1cf0b6fbf191799766b4e609664881b96f8 (diff)
ENGR00114325-1: SIM: Add MX25 support
Add support for MX25 SIM to Kconfig file; Fix Codes Y2 is zero case. Signed-off-by: Richard Zhu <r65037@freescale.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/char/Kconfig2
-rw-r--r--drivers/char/imx_sim.c54
2 files changed, 39 insertions, 17 deletions
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig
index 983462e4e642..e5589b6d7831 100644
--- a/drivers/char/Kconfig
+++ b/drivers/char/Kconfig
@@ -437,7 +437,7 @@ config MXS_VIIM
config IMX_SIM
tristate "IMX SIM support"
- depends on ARCH_MX51
+ depends on (ARCH_MX51 || MACH_MX25_3DS)
---help---
Say Y to enable the SIM driver support.
diff --git a/drivers/char/imx_sim.c b/drivers/char/imx_sim.c
index 22d46774b5c3..41bee5d7cdcb 100644
--- a/drivers/char/imx_sim.c
+++ b/drivers/char/imx_sim.c
@@ -306,6 +306,7 @@ static int sim_calc_param(uint32_t fi, uint32_t di, uint32_t *ptr_divisor,
uint32_t sample12 = 1;
uint32_t divisor = 31;
+ pr_debug("%s entering.\n", __func__);
if ((f > 0) || (d > 0)) {
if (stage2_fra == 0) {
if ((stage2_div % 12) == 0) {
@@ -358,6 +359,7 @@ static int sim_set_param(sim_t *sim, sim_param_t *param)
uint32_t divisor, sample12, reg_data;
int errval;
+ pr_debug("%s entering.\n", __func__);
errval = sim_calc_param(param->FI, param->DI, &divisor, &sample12);
if (errval == SIM_OK) {
__raw_writel(divisor, sim->ioaddr + DIVISOR);
@@ -390,6 +392,7 @@ static void sim_atr_received(sim_t *sim)
sim_param_t param_default = SIM_PARAM_DEFAULT;
sim->param_atr = param_default;
+ pr_debug("%s entering.\n", __func__);
if (sim->atrparser.ifc_valid & (1 << (SIM_IFC_TA1))) {
sim->param_atr.FI = sim->atrparser.TXI[SIM_IFC_TA1] >> 4;
sim->param_atr.DI = sim->atrparser.TXI[SIM_IFC_TA1] & 0x0f;
@@ -493,6 +496,7 @@ static void sim_xmt_start(sim_t *sim, int pos, int count)
static void sim_atr_add(sim_t *sim, uint8_t data)
{
+ pr_debug("%s entering.\n", __func__);
if (sim->atr.size < SIM_ATR_LENGTH_MAX)
sim->atr.t[sim->atr.size++] = data;
else
@@ -609,6 +613,9 @@ static void sim_fsm(sim_t *sim, uint16_t data)
printk(KERN_ERR "ERROR !\n");
break;
};
+
+ if (sim->atrparser.ifc_current_valid == 0)
+ goto sim_fsm_atr_thb;
} else {
sim_fsm_atr_thb:
if (sim->atrparser.num_hb) {
@@ -779,6 +786,7 @@ static void sim_power_on(sim_t *sim)
uint32_t reg_data;
/* power on sequence */
+ pr_debug("%s Powering on the sim port.\n", __func__);
reg_data = __raw_readl(sim->ioaddr + PORT0_CNTL);
reg_data |= SIM_PORT_CNTL_SVEN;
__raw_writel(reg_data, sim->ioaddr + PORT0_CNTL);
@@ -803,6 +811,8 @@ static void sim_power_on(sim_t *sim)
reg_data = __raw_readl(sim->ioaddr + PORT0_CNTL);
reg_data |= SIM_PORT_CNTL_SRST;
__raw_writel(reg_data, sim->ioaddr + PORT0_CNTL);
+ pr_debug("%s port0_ctl is 0x%x.\n", __func__,
+ __raw_readl(sim->ioaddr + PORT0_CNTL));
sim->power = SIM_POWER_ON;
};
@@ -818,6 +828,7 @@ static void sim_power_off(sim_t *sim)
{
uint32_t reg_data;
+ pr_debug("%s entering.\n", __func__);
/* sim_power_off sequence */
reg_data = __raw_readl(sim->ioaddr + PORT0_CNTL);
reg_data &= ~SIM_PORT_CNTL_SCEN;
@@ -850,6 +861,7 @@ static void sim_start(sim_t *sim)
{
uint32_t reg_data, clk_rate, clk_div = 0;
+ pr_debug("%s entering.\n", __func__);
/* Configuring SIM for Operation */
reg_data = SIM_XMT_THRESHOLD_XTH(0) | SIM_XMT_THRESHOLD_TDT(4);
__raw_writel(reg_data, sim->ioaddr + XMT_THRESHOLD);
@@ -859,6 +871,7 @@ static void sim_start(sim_t *sim)
clk_div = clk_rate / sim->plat_data->clk_rate;
if (clk_rate % sim->plat_data->clk_rate)
clk_div++;
+ pr_debug("%s prescaler is 0x%x.\n", __func__, clk_div);
__raw_writel(clk_div, sim->ioaddr + CLK_PRESCALER);
reg_data = SIM_CNTL_GPCNT_CLK_SEL(0) | SIM_CNTL_BAUD_SEL(7)
@@ -922,6 +935,7 @@ static void sim_start(sim_t *sim)
static void sim_stop(sim_t *sim)
{
+ pr_debug("%s entering.\n", __func__);
__raw_writel(0, sim->ioaddr + SETUP);
__raw_writel(0, sim->ioaddr + ENABLE);
__raw_writel(0, sim->ioaddr + PORT0_CNTL);
@@ -974,6 +988,7 @@ static void sim_data_reset(sim_t *sim)
static void sim_cold_reset(sim_t *sim)
{
+ pr_debug("%s entering.\n", __func__);
if (sim->present != SIM_PRESENT_REMOVED) {
sim_power_off(sim);
sim_stop(sim);
@@ -999,6 +1014,7 @@ static void sim_warm_reset(sim_t *sim)
{
uint32_t reg_data;
+ pr_debug("%s entering.\n", __func__);
if (sim->present != SIM_PRESENT_REMOVED) {
reg_data = __raw_readl(sim->ioaddr + PORT0_CNTL);
reg_data |= SIM_PORT_CNTL_SRST;
@@ -1023,6 +1039,7 @@ static int sim_card_lock(sim_t *sim)
{
int errval;
+ pr_debug("%s entering.\n", __func__);
/* place holder for true physcial locking */
if (sim->present != SIM_PRESENT_REMOVED)
errval = SIM_OK;
@@ -1043,6 +1060,7 @@ static int sim_card_eject(sim_t *sim)
{
int errval;
+ pr_debug("%s entering.\n", __func__);
/* place holder for true physcial locking */
if (sim->present != SIM_PRESENT_REMOVED)
errval = SIM_OK;
@@ -1066,6 +1084,7 @@ static int sim_ioctl(struct inode *inode, struct file *file,
sim_t *sim = (sim_t *) file->private_data;
+ pr_debug("%s entering.\n", __func__);
switch (cmd) {
pr_debug("ioctl cmd %d is issued...\n", cmd);
@@ -1251,6 +1270,7 @@ static int sim_ioctl(struct inode *inode, struct file *file,
static int sim_fasync(int fd, struct file *file, int mode)
{
sim_t *sim = (sim_t *) file->private_data;
+ pr_debug("%s entering.\n", __func__);
return fasync_helper(fd, file, mode, &sim->fasync);
}
@@ -1268,6 +1288,7 @@ static int sim_open(struct inode *inode, struct file *file)
sim_t *sim = dev_get_drvdata(sim_dev.parent);
file->private_data = sim;
+ pr_debug("%s entering.\n", __func__);
if (!sim->ioaddr) {
errval = -ENOMEM;
return errval;
@@ -1297,6 +1318,7 @@ static int sim_release(struct inode *inode, struct file *file)
sim_t *sim = (sim_t *) file->private_data;
+ pr_debug("%s entering.\n", __func__);
if (sim->clk_flag) {
pr_debug("\n%s disable the clock\n", __func__);
clk_disable(sim->clk);
@@ -1376,13 +1398,8 @@ static int sim_probe(struct platform_device *pdev)
pr_debug("sim clock:%lu\n", clk_get_rate(sim->clk));
sim->ipb_irq = platform_get_irq(pdev, 0);
- if (!sim->ipb_irq) {
- ret = -ENOMEM;
- goto out1;
- }
-
sim->dat_irq = platform_get_irq(pdev, 1);
- if (!sim->dat_irq) {
+ if (!(sim->ipb_irq | sim->dat_irq)) {
ret = -ENOMEM;
goto out1;
}
@@ -1396,12 +1413,13 @@ static int sim_probe(struct platform_device *pdev)
}
sim->ioaddr = (void *)ioremap(sim->res->start, sim->res->end -
- sim->res->start + 1);
-
- ret = request_irq(sim->ipb_irq, sim_irq_handler,
- 0, "mxc_sim_ipb", sim);
- ret |= request_irq(sim->dat_irq, sim_irq_handler,
- 0, "mxc_sim_dat", sim);
+ sim->res->start + 1);
+ if (sim->ipb_irq)
+ ret = request_irq(sim->ipb_irq, sim_irq_handler,
+ 0, "mxc_sim_ipb", sim);
+ if (sim->dat_irq)
+ ret |= request_irq(sim->dat_irq, sim_irq_handler,
+ 0, "mxc_sim_dat", sim);
if (ret) {
printk(KERN_ERR "Can't get the irq\n");
@@ -1415,8 +1433,10 @@ static int sim_probe(struct platform_device *pdev)
return ret;
out2:
- free_irq(sim->ipb_irq, sim);
- free_irq(sim->dat_irq, sim);
+ if (sim->ipb_irq)
+ free_irq(sim->ipb_irq, sim);
+ if (sim->dat_irq)
+ free_irq(sim->dat_irq, sim);
release_mem_region(sim->res->start,
sim->res->end - sim->res->start + 1);
out1:
@@ -1432,8 +1452,10 @@ static int sim_remove(struct platform_device *pdev)
clk_put(sim->clk);
- free_irq(sim->ipb_irq, sim);
- free_irq(sim->dat_irq, sim);
+ if (sim->ipb_irq)
+ free_irq(sim->ipb_irq, sim);
+ if (sim->dat_irq)
+ free_irq(sim->dat_irq, sim);
iounmap(sim->ioaddr);