mfd:rtsx: MFD patches for Realtek cardreader
cover mfd:rtsx: MFD patches for Realtek cardreader
From: Wei WANG <[email protected]>
Wei WANG (5):
mfd:rtsx: Read vendor setting from config space mfd:rtsx: Add shutdown callback in rtsx_pci_driver mfd:rtsx: Move some actions from rtsx_pci_init_hw to individual
extra_init_hw
mfd:rtsx: Clear hardware PFM mode in rtl8411b mfd:rtsx: Configure to enter a deeper power-saving mode in S3
drivers/mfd/rtl8411.c | 86 ++++++++++++++++++++++++++--- drivers/mfd/rts5209.c | 55 +++++++++++++------ drivers/mfd/rts5227.c | 113 ++++++++++++++++++++++++++++++--------- drivers/mfd/rts5229.c | 49 +++++++++++++++-- drivers/mfd/rts5249.c | 108 +++++++++++++++++++++++++++++-------- drivers/mfd/rtsx_pcr.c | 76 +++++++++++++++++++------- drivers/mfd/rtsx_pcr.h | 15 +++++- include/linux/mfd/rtsx_common.h | 3 +- include/linux/mfd/rtsx_pci.h | 35 ++++++++++-- 9 files changed, 439 insertions(+), 101 deletions(-)
Signature · 1 line
1.7.9.5
PATCH 1/5 mfd:rtsx: Read vendor setting from config space
From: Wei WANG <[email protected]>
Normally OEMs will set vendor setting to the config space of Realtek card reader in BIOS stage. This patch reads the setting at the first, and configure the internal registers according to it, to improve card reader's compatibility condition.
--- drivers/mfd/rtl8411.c | 77 +++++++++++++++++++++++++++---- drivers/mfd/rts5209.c | 45 ++++++++++++------ drivers/mfd/rts5227.c | 96 +++++++++++++++++++++++++++++---------- drivers/mfd/rts5229.c | 39 ++++++++++++++-- drivers/mfd/rts5249.c | 91 ++++++++++++++++++++++++++++--------- drivers/mfd/rtsx_pcr.c | 29 ++++++++++-- drivers/mfd/rtsx_pcr.h | 15 +++++- include/linux/mfd/rtsx_common.h | 3 +- include/linux/mfd/rtsx_pci.h | 21 +++++++-- 9 files changed, 331 insertions(+), 85 deletions(-)
drivers/mfd/rtl8411.c +69 -8
@@ -1,6 +1,6 @@/* Driver for Realtek PCI-Express card reader * -* Copyright(c) 2009 Realtek Semiconductor Corp. All rights reserved. +* Copyright(c) 2009-2013 Realtek Semiconductor Corp. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the
@@ -17,7 +17,7 @@* * Author: * Wei WANG <[email protected]> -* No. 450, Shenhu Road, Suzhou Industry Park, Suzhou, China +* Roger Tseng <[email protected]> */ #include <linux/module.h>
@@ -47,19 +47,66 @@ static int rtl8411b_is_qfn48(struct rtsx_pcr *pcr)return 0 ; } +static void rtl8411_init_settings (struct rtsx_pcr *pcr) +{ +u32 val1; +u8 val2; + +rtsx_pci_read_config_dword (pcr,PCR_SETTING_REG1 , &val1); +dev_dbg (&(pcr->pci->dev),"Cfg 0x%x: 0x%x\n" ,PCR_SETTING_REG1 , val1); + +if (!(val1 &0x1000000 )) { + pcr->aspm_val = (u8)((val1 >>28 ) &0x03 ); + pcr->sd30_drive_sel_1v8 =map_sd_drive ((val1 >>26 ) &0x03 ); + pcr->card_drive_sel &=0x3F ; + pcr->card_drive_sel |= (u8)((val1 >>25 ) &0x01 ) <<6 ; + +rtsx_pci_read_config_byte (pcr,PCR_SETTING_REG3 , &val2); +dev_dbg (&(pcr->pci->dev),"Cfg 0x%x: 0x%x\n" , +PCR_SETTING_REG3 , val2); + pcr->sd30_drive_sel_3v3 = (val2 >>5 ) &0x07 ; + } +} + +static void rtl8411b_init_settings (struct rtsx_pcr *pcr) +{ +u32 val; + +rtsx_pci_read_config_dword (pcr,PCR_SETTING_REG1 , &val); +dev_dbg (&(pcr->pci->dev),"Cfg 0x%x: 0x%x\n" ,PCR_SETTING_REG1 , val); + +if (!(val &0x1000000 )) { + pcr->aspm_val = (u8)((val >>28 ) &0x03 ); + pcr->sd30_drive_sel_1v8 =map_sd_drive ((val >>26 ) &0x03 ); + pcr->sd30_drive_sel_3v3 =map_sd_drive (val &0x03 ); + } +} +static int rtl8411_extra_init_hw (struct rtsx_pcr *pcr) { -return rtsx_pci_write_register (pcr,CD_PAD_CTL , +rtsx_pci_init_cmd (pcr); + +rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,SD30_DRIVE_SEL , +0xFF , pcr->sd30_drive_sel_3v3); +rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,CD_PAD_CTL ,CD_DISABLE_MASK |CD_AUTO_DISABLE ,CD_ENABLE ); + +return rtsx_pci_send_cmd (pcr,100 ); }static int rtl8411b_extra_init_hw (struct rtsx_pcr *pcr) { -if (rtl8411b_is_qfn48 (pcr)) -rtsx_pci_write_register (pcr,CARD_PULL_CTL3 ,0xFF ,0xF5 ); +rtsx_pci_init_cmd (pcr); -return rtsx_pci_write_register (pcr,CD_PAD_CTL , +if (rtl8411b_is_qfn48 (pcr)) +rtsx_pci_add_cmd (pcr,WRITE_REG_CMD , +CARD_PULL_CTL3 ,0xFF ,0xF5 ); +rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,SD30_DRIVE_SEL , +0xFF , pcr->sd30_drive_sel_3v3); +rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,CD_PAD_CTL ,CD_DISABLE_MASK |CD_AUTO_DISABLE ,CD_ENABLE ); + +return rtsx_pci_send_cmd (pcr,100 ); }static int rtl8411_turn_on_led (struct rtsx_pcr *pcr)
@@ -141,13 +188,13 @@ static int rtl8411_switch_output_voltage(struct rtsx_pcr *pcr, u8 voltage) mask = (BPP_REG_TUNED18 <<BPP_TUNED18_SHIFT_8411 ) |BPP_PAD_MASK ;if (voltage ==OUTPUT_3V3 ) { err =rtsx_pci_write_register (pcr, -SD30_DRIVE_SEL ,0x07 ,DRIVER_TYPE_D ); +SD30_DRIVE_SEL ,0x07 , pcr->sd30_drive_sel_3v3);if (err <0 )return err; val = (BPP_ASIC_3V3 <<BPP_TUNED18_SHIFT_8411 ) |BPP_PAD_3V3 ; }else if (voltage ==OUTPUT_1V8 ) { err =rtsx_pci_write_register (pcr, -SD30_DRIVE_SEL ,0x07 ,DRIVER_TYPE_B ); +SD30_DRIVE_SEL ,0x07 , pcr->sd30_drive_sel_1v8);if (err <0 )return err; val = (BPP_ASIC_1V8 <<BPP_TUNED18_SHIFT_8411 ) |BPP_PAD_1V8 ;
@@ -222,6 +269,7 @@ static int rtl8411_conv_clk_and_div_n(int input, int dir) }static const struct pcr_ops rtl8411_pcr_ops = { + .init_settings = rtl8411_init_settings, .extra_init_hw = rtl8411_extra_init_hw, .optimize_phy =NULL , .turn_on_led = rtl8411_turn_on_led,
@@ -236,6 +284,7 @@ static const struct pcr_ops rtl8411_pcr_ops = { };static const struct pcr_ops rtl8411b_pcr_ops = { + .init_settings = rtl8411b_init_settings, .extra_init_hw = rtl8411b_extra_init_hw, .optimize_phy =NULL , .turn_on_led = rtl8411_turn_on_led,
@@ -385,6 +434,12 @@ void rtl8411_init_params(struct rtsx_pcr *pcr) pcr->num_slots =2 ; pcr->ops = &rtl8411_pcr_ops; + pcr->flags =0 ; + pcr->card_drive_sel =0x55 ; + pcr->sd30_drive_sel_1v8 =0x03 ; + pcr->sd30_drive_sel_3v3 =0x01 ; + pcr->aspm_val =0x02 ; + pcr->ic_version =rtl8411_get_ic_version (pcr); pcr->sd_pull_ctl_enable_tbl = rtl8411_sd_pull_ctl_enable_tbl; pcr->sd_pull_ctl_disable_tbl = rtl8411_sd_pull_ctl_disable_tbl;
@@ -398,6 +453,12 @@ void rtl8411b_init_params(struct rtsx_pcr *pcr) pcr->num_slots =2 ; pcr->ops = &rtl8411b_pcr_ops; + pcr->flags =0 ; + pcr->card_drive_sel =0x55 ; + pcr->sd30_drive_sel_1v8 =0x03 ; + pcr->sd30_drive_sel_3v3 =0x01 ; + pcr->aspm_val =0x02 ; + pcr->ic_version =rtl8411_get_ic_version (pcr);if (rtl8411b_is_qfn48 (pcr)) {
drivers/mfd/rts5209.c +30 -15
115 lines not on this page · raw message
drivers/mfd/rts5227.c +72 -24
153 lines not on this page · raw message
drivers/mfd/rts5229.c +34 -5
@@ -1,6 +1,6 @@/* Driver for Realtek PCI-Express card reader * -* Copyright(c) 2009 Realtek Semiconductor Corp. All rights reserved. +* Copyright(c) 2009-2013 Realtek Semiconductor Corp. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the
@@ -17,7 +17,6 @@* * Author: * Wei WANG <[email protected]> -* No. 450, Shenhu Road, Suzhou Industry Park, Suzhou, China */ #include <linux/module.h>
@@ -34,6 +33,26 @@ static u8 rts5229_get_ic_version(struct rtsx_pcr *pcr)return val &0x0F ; } +static void rts5229_init_settings (struct rtsx_pcr *pcr) +{ +u32 val; + +rtsx_pci_read_config_dword (pcr,PCR_SETTING_REG1 , &val); +dev_dbg (&(pcr->pci->dev),"Cfg 0x%x: 0x%x\n" ,PCR_SETTING_REG1 , val); + +if (!(val &0x1000000 )) { + pcr->aspm_val = (u8)((val >>28 ) &0x03 ); + pcr->sd30_drive_sel_1v8 =map_sd_drive ((val >>26 ) &0x03 ); + pcr->card_drive_sel &=0x3F ; + pcr->card_drive_sel |= (u8)((val >>25 ) &0x01 ) <<6 ; + +rtsx_pci_read_config_dword (pcr,PCR_SETTING_REG2 , &val); +dev_dbg (&(pcr->pci->dev),"Cfg 0x%x: 0x%x\n" , +PCR_SETTING_REG2 , val); + pcr->sd30_drive_sel_3v3 =map_sd_drive ((val >>5 ) &0x03 ); + } +} +static int rts5229_extra_init_hw (struct rtsx_pcr *pcr) {rtsx_pci_init_cmd (pcr);
@@ -45,6 +64,9 @@ static int rts5229_extra_init_hw(struct rtsx_pcr *pcr)rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,LDO_PWR_SEL ,0x03 ,0x01 );/* LED shine disabled, set initial shine cycle period */ rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,OLT_LED_CTL ,0x0F ,0x02 ); +/* Configure driving */ +rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,SD30_DRIVE_SEL , +0xFF , pcr->sd30_drive_sel_3v3);return rtsx_pci_send_cmd (pcr,100 ); }
@@ -110,7 +132,7 @@ static int rts5229_card_power_off(struct rtsx_pcr *pcr, int card)SD_POWER_MASK |PMOS_STRG_MASK , SD_POWER_OFF | PMOS_STRG_400mA);rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,PWR_GATE_CTRL , -LDO3318_PWR_MASK ,0X00 ); +LDO3318_PWR_MASK ,0x00 );return rtsx_pci_send_cmd (pcr,100 ); }
@@ -120,7 +142,7 @@ static int rts5229_switch_output_voltage(struct rtsx_pcr *pcr, u8 voltage)if (voltage ==OUTPUT_3V3 ) { err =rtsx_pci_write_register (pcr, -SD30_DRIVE_SEL ,0x07 ,DRIVER_TYPE_D ); +SD30_DRIVE_SEL ,0x07 , pcr->sd30_drive_sel_3v3);if (err <0 )return err; err =rtsx_pci_write_phy_register (pcr,0x08 ,0x4FC0 |0x24 );
@@ -128,7 +150,7 @@ static int rts5229_switch_output_voltage(struct rtsx_pcr *pcr, u8 voltage)return err; }else if (voltage ==OUTPUT_1V8 ) { err =rtsx_pci_write_register (pcr, -SD30_DRIVE_SEL ,0x07 ,DRIVER_TYPE_B ); +SD30_DRIVE_SEL ,0x07 , pcr->sd30_drive_sel_1v8);if (err <0 )return err; err =rtsx_pci_write_phy_register (pcr,0x08 ,0x4C40 |0x24 );
@@ -142,6 +164,7 @@ static int rts5229_switch_output_voltage(struct rtsx_pcr *pcr, u8 voltage) }static const struct pcr_ops rts5229_pcr_ops = { + .init_settings = rts5229_init_settings, .extra_init_hw = rts5229_extra_init_hw, .optimize_phy = rts5229_optimize_phy, .turn_on_led = rts5229_turn_on_led,
@@ -221,6 +244,12 @@ void rts5229_init_params(struct rtsx_pcr *pcr) pcr->num_slots =2 ; pcr->ops = &rts5229_pcr_ops; + pcr->flags =0 ; + pcr->card_drive_sel =0x41 ; + pcr->sd30_drive_sel_1v8 =0x03 ; + pcr->sd30_drive_sel_3v3 =0x01 ; + pcr->aspm_val =0x02 ; + pcr->ic_version =rts5229_get_ic_version (pcr);if (pcr->ic_version ==IC_VER_C ) { pcr->sd_pull_ctl_enable_tbl = rts5229_sd_pull_ctl_enable_tbl2;
drivers/mfd/rts5249.c +70 -21
142 lines not on this page · raw message
drivers/mfd/rtsx_pcr.c +24 -5
@@ -1,6 +1,6 @@/* Driver for Realtek PCI-Express card reader * -* Copyright(c) 2009 Realtek Semiconductor Corp. All rights reserved. +* Copyright(c) 2009-2013 Realtek Semiconductor Corp. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the
@@ -17,7 +17,6 @@* * Author: * Wei WANG <[email protected]> -* No. 450, Shenhu Road, Suzhou Industry Park, Suzhou, China */ #include <linux/pci.h>
@@ -73,6 +72,9 @@ void rtsx_pci_start_run(struct rtsx_pcr *pcr) pcr->state =PDEV_STAT_RUN ;if (pcr->ops->enable_auto_blink) pcr->ops->enable_auto_blink (pcr); + +if (pcr->aspm_val) +rtsx_pci_write_config_byte (pcr,LCTLR ,0 ); }mod_delayed_work (system_wq, &pcr->idle_work,msecs_to_jiffies (200 ));
@@ -717,7 +719,7 @@ int rtsx_pci_card_exclusive_check(struct rtsx_pcr *pcr, int card) [RTSX_MS_CARD] = MS_EXIST }; -if (!pcr->ms_pmos) { +if (!(pcr->flags &PCR_MS_PMOS )) {/* When using single PMOS, accessing card is not permitted * if the existing card is not the designated one. */
@@ -918,6 +920,9 @@ static void rtsx_pci_idle_work(struct work_struct *work)if (pcr->ops->turn_off_led) pcr->ops->turn_off_led (pcr); +if (pcr->aspm_val) +rtsx_pci_write_config_byte (pcr,LCTLR , pcr->aspm_val); +mutex_unlock (&pcr->pcr_mutex); }
@@ -956,8 +961,8 @@ static int rtsx_pci_init_hw(struct rtsx_pcr *pcr)/* Reset delink mode */ rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,CHANGE_LINK_STATE ,0x0A ,0 );/* Card driving select */ -rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,SD30_DRIVE_SEL , -0x07 ,DRIVER_TYPE_D ); +rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,CARD_DRIVE_SEL , +0xFF , pcr->card_drive_sel);/* Enable SSC Clock */ rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,SSC_CTL1 ,0xFF ,SSC_8X_EN |SSC_SEL_4M );
@@ -989,6 +994,8 @@ static int rtsx_pci_init_hw(struct rtsx_pcr *pcr)if (err <0 )return err; +rtsx_pci_write_config_byte (pcr,LCTLR ,0 ); +/* Enable clk_request_n to enable clock power management */ rtsx_pci_write_config_byte (pcr,0x81 ,1 );/* Enter L1 when host tx idle */
@@ -1053,6 +1060,18 @@ static int rtsx_pci_init_chip(struct rtsx_pcr *pcr)if (!pcr->slots)return -ENOMEM ; +if (pcr->ops->init_settings) + pcr->ops->init_settings (pcr); + +dev_dbg (&(pcr->pci->dev),"pcr->aspm_val = 0x%x\n" , pcr->aspm_val); +dev_dbg (&(pcr->pci->dev),"pcr->sd30_drive_sel_1v8 = 0x%x\n" , + pcr->sd30_drive_sel_1v8); +dev_dbg (&(pcr->pci->dev),"pcr->sd30_drive_sel_3v3 = 0x%x\n" , + pcr->sd30_drive_sel_3v3); +dev_dbg (&(pcr->pci->dev),"pcr->card_drive_sel = 0x%x\n" , + pcr->card_drive_sel); +dev_dbg (&(pcr->pci->dev),"pcr->flags = 0x%x\n" , pcr->flags); + pcr->state =PDEV_STAT_IDLE ; err =rtsx_pci_init_hw (pcr);if (err <0 ) {
drivers/mfd/rtsx_pcr.h +13 -2
@@ -1,6 +1,6 @@/* Driver for Realtek PCI-Express card reader * -* Copyright(c) 2009 Realtek Semiconductor Corp. All rights reserved. +* Copyright(c) 2009-2013 Realtek Semiconductor Corp. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the
@@ -17,7 +17,6 @@* * Author: * Wei WANG <[email protected]> -* No. 450, Shenhu Road, Suzhou Industry Park, Suzhou, China */ #ifndef __RTSX_PCR_H
@@ -35,4 +34,16 @@ void rts5227_init_params(struct rtsx_pcr *pcr);void rts5249_init_params (struct rtsx_pcr *pcr);void rtl8411b_init_params (struct rtsx_pcr *pcr); +static inline u8 map_sd_drive (int idx) +{ +u8 sd_drive[4 ] = { +0x01 ,/* Type D */ +0x02 ,/* Type C */ +0x05 ,/* Type A */ +0x03 /* Type B */ + }; + +return sd_drive[idx]; +} +#endif
include/linux/mfd/rtsx_common.h +1 -2
@@ -1,6 +1,6 @@/* Driver for Realtek driver-based card reader * -* Copyright(c) 2009 Realtek Semiconductor Corp. All rights reserved. +* Copyright(c) 2009-2013 Realtek Semiconductor Corp. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the
@@ -17,7 +17,6 @@* * Author: * Wei WANG <[email protected]> -* No. 450, Shenhu Road, Suzhou Industry Park, Suzhou, China */ #ifndef __RTSX_COMMON_H
include/linux/mfd/rtsx_pci.h +18 -3
@@ -1,6 +1,6 @@/* Driver for Realtek PCI-Express card reader * -* Copyright(c) 2009 Realtek Semiconductor Corp. All rights reserved. +* Copyright(c) 2009-2013 Realtek Semiconductor Corp. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the
@@ -17,7 +17,6 @@* * Author: * Wei WANG <[email protected]> -* No. 450, Shenhu Road, Suzhou Industry Park, Suzhou, China */ #ifndef __RTSX_PCI_H
@@ -684,6 +683,8 @@#define DUMMY_REG_RESET_0 0xFE90 +#define AUTOLOAD_CFG_BASE 0xFF00 +/* Memory mapping */ #define SRAM_BASE 0xE600#define RBUF_BASE 0xF400
@@ -726,6 +727,11 @@#define PHY_FLD4 0x1E#define PHY_DUM_REG 0x1F +#define LCTLR 0x80 +#define PCR_SETTING_REG1 0x724 +#define PCR_SETTING_REG2 0x814 +#define PCR_SETTING_REG3 0x747 +#define rtsx_pci_init_cmd (pcr) ((pcr)->ci = 0)struct rtsx_pcr ;
@@ -747,6 +753,7 @@ struct pcr_ops { u8 voltage);unsigned int (*cd_deglitch)(struct rtsx_pcr *pcr);int (*conv_clk_and_div_n)(int clk,int dir); +void (*init_settings)(struct rtsx_pcr *pcr); };enum PDEV_STAT {PDEV_STAT_IDLE ,PDEV_STAT_RUN };
@@ -788,7 +795,6 @@ struct rtsx_pcr {struct completion *finish_me;unsigned int cur_clock; -bool ms_pmos;bool remove_pci;bool msi_en;
@@ -806,6 +812,15 @@ struct rtsx_pcr {#define IC_VER_D 3u8 ic_version; +u8 sd30_drive_sel_1v8; +u8 sd30_drive_sel_3v3; +u8 card_drive_sel; +u8 aspm_val; + +#define PCR_MS_PMOS (1 << 0) +#define PCR_REVERSE_SOCKET (1 << 1) +u32 flags; +const u32 *sd_pull_ctl_enable_tbl;const u32 *sd_pull_ctl_disable_tbl;const u32 *ms_pull_ctl_enable_tbl;
Signature · 1 line
1.7.9.5
Re: [PATCH 1/5] mfd:rtsx: Read vendor setting from config space
This code has a lot of undocumented magic flags and terrible naming in it.
drivers/mfd/rtl8411.c static int rtl8411b_is_qfn48(struct rtsx_pcr *pcr) · line 53
Quoted 4 lines
drivers/mfd/rtl8411.c +4
-0+static void rtl8411_init_settings (struct rtsx_pcr *pcr) +{ +u32 val1; +u8 val2;
These names are 100% useless. "val" means nothing. "1" means nothing. "2" means nothing. In fact, val1 is REG1 and val2 is REG3 as opposed to REG2 as one would expect from the name so it is misleading.
drivers/mfd/rtl8411.c static int rtl8411b_is_qfn48(struct rtsx_pcr *pcr) · line 58
Quoted 5 lines
drivers/mfd/rtl8411.c +5
-0+ +rtsx_pci_read_config_dword (pcr,PCR_SETTING_REG1 , &val1); +dev_dbg (&(pcr->pci->dev),"Cfg 0x%x: 0x%x\n" ,PCR_SETTING_REG1 , val1); + +if (!(val1 &0x1000000 )) {
What is 0x1000000? We do this test over and over so it should be an inline function.
drivers/mfd/rtl8411.c static int rtl8411b_is_qfn48(struct rtsx_pcr *pcr) · line 59
Quoted 1 line
drivers/mfd/rtl8411.c +1
-0+ pcr->aspm_val = (u8)((val1 >>28 ) &0x03 );
The "_val" in "apsm_val" is useless.
What does "aspm" stand for?
No need to cast. 0-3 is less than 255 so casting to u8 is just noise.
These shift masks are used over and over so they should be defined as macros or inline functions in a header file:
#define rtl8411_reg_to_XXX(reg) ((reg >> 25) & 0x01)
#define rtl8411_reg_to_sdXXX(reg) ((reg >> 26) & 0x03)
#define rtl8411_reg_to_aspm(reg) ((reg >> 28) & 0x03)
(Choose your own names which make sense).
drivers/mfd/rtl8411.c static int rtl8411b_is_qfn48(struct rtsx_pcr *pcr) · line 62
Quoted 3 lines
drivers/mfd/rtl8411.c +3
-0+ pcr->sd30_drive_sel_1v8 =map_sd_drive ((val1 >>26 ) &0x03 ); + pcr->card_drive_sel &=0x3F ; + pcr->card_drive_sel |= (u8)((val1 >>25 ) &0x01 ) <<6 ;
Again, no need to cast. This should be a macro or an inline function.
Pretty much the same comments apply throughout. I'm not going to comment on it line by line.
regards,
dan carpenter
PATCH 2/5 mfd:rtsx: Add shutdown callback in rtsx_pci_driver
In reply to [email protected]From: Wei WANG <[email protected]>
Some actions to clear power state should be handled in .shutdown callback in rtsx_pci_driver. This patch adopts the following measures to catch this goal:
1. Add a function rtsx_pci_power_off to abstract the common ops in .shutdown and .suspend
2. Add pcr->ops->force_power_down to fulfill the individual action for each reader model
--- drivers/mfd/rtl8411.c | 7 +++++++ drivers/mfd/rts5209.c | 6 ++++++ drivers/mfd/rts5227.c | 11 +++++++++++ drivers/mfd/rts5229.c | 6 ++++++ drivers/mfd/rts5249.c | 11 +++++++++++ drivers/mfd/rtsx_pcr.c | 43 ++++++++++++++++++++++++++++++++---------- include/linux/mfd/rtsx_pci.h | 10 ++++++++++ 7 files changed, 84 insertions(+), 10 deletions(-)
drivers/mfd/rtl8411.c +7 -0
@@ -82,6 +82,11 @@ static void rtl8411b_init_settings(struct rtsx_pcr *pcr) } } +static void rtl8411_force_power_down (struct rtsx_pcr *pcr) +{ +rtsx_pci_write_register (pcr,FPDCTL ,0x07 ,0x07 ); +} +static int rtl8411_extra_init_hw (struct rtsx_pcr *pcr) {rtsx_pci_init_cmd (pcr);
@@ -281,6 +286,7 @@ static const struct pcr_ops rtl8411_pcr_ops = { .switch_output_voltage = rtl8411_switch_output_voltage, .cd_deglitch = rtl8411_cd_deglitch, .conv_clk_and_div_n = rtl8411_conv_clk_and_div_n, + .force_power_down = rtl8411_force_power_down, };static const struct pcr_ops rtl8411b_pcr_ops = {
@@ -296,6 +302,7 @@ static const struct pcr_ops rtl8411b_pcr_ops = { .switch_output_voltage = rtl8411_switch_output_voltage, .cd_deglitch = rtl8411_cd_deglitch, .conv_clk_and_div_n = rtl8411_conv_clk_and_div_n, + .force_power_down = rtl8411_force_power_down, };/* SD Pull Control Enable:
drivers/mfd/rts5209.c +6 -0
@@ -56,6 +56,11 @@ static void rts5209_init_settings(struct rtsx_pcr *pcr) } } +static void rts5209_force_power_down (struct rtsx_pcr *pcr) +{ +rtsx_pci_write_register (pcr,FPDCTL ,0x07 ,0x07 ); +} +static int rts5209_extra_init_hw (struct rtsx_pcr *pcr) {rtsx_pci_init_cmd (pcr);
@@ -194,6 +199,7 @@ static const struct pcr_ops rts5209_pcr_ops = { .switch_output_voltage = rts5209_switch_output_voltage, .cd_deglitch = NULL, .conv_clk_and_div_n = NULL, + .force_power_down = rts5209_force_power_down, };/* SD Pull Control Enable:
drivers/mfd/rts5227.c +11 -0
@@ -80,6 +80,16 @@ static void rts5227_init_settings(struct rtsx_pcr *pcr) } } +static void rts5227_force_power_down (struct rtsx_pcr *pcr) +{ +/* Set relink_time to 0 */ +rtsx_pci_write_register (pcr,AUTOLOAD_CFG_BASE +1 ,0xFF ,0 ); +rtsx_pci_write_register (pcr,AUTOLOAD_CFG_BASE +2 ,0xFF ,0 ); +rtsx_pci_write_register (pcr,AUTOLOAD_CFG_BASE +3 ,0x01 ,0 ); + +rtsx_pci_write_register (pcr,FPDCTL ,0x03 ,0x03 ); +} +static int rts5227_extra_init_hw (struct rtsx_pcr *pcr) {u16 cap;
@@ -215,6 +225,7 @@ static const struct pcr_ops rts5227_pcr_ops = { .switch_output_voltage = rts5227_switch_output_voltage, .cd_deglitch = NULL, .conv_clk_and_div_n = NULL, + .force_power_down = rts5227_force_power_down, };/* SD Pull Control Enable:
drivers/mfd/rts5229.c +6 -0
@@ -53,6 +53,11 @@ static void rts5229_init_settings(struct rtsx_pcr *pcr) } } +static void rts5229_force_power_down (struct rtsx_pcr *pcr) +{ +rtsx_pci_write_register (pcr,FPDCTL ,0x03 ,0x03 ); +} +static int rts5229_extra_init_hw (struct rtsx_pcr *pcr) {rtsx_pci_init_cmd (pcr);
@@ -176,6 +181,7 @@ static const struct pcr_ops rts5229_pcr_ops = { .switch_output_voltage = rts5229_switch_output_voltage, .cd_deglitch = NULL, .conv_clk_and_div_n = NULL, + .force_power_down = rts5229_force_power_down, };/* SD Pull Control Enable:
drivers/mfd/rts5249.c +11 -0
@@ -87,6 +87,16 @@ static void rts5249_init_settings(struct rtsx_pcr *pcr) } } +static void rts5249_force_power_down (struct rtsx_pcr *pcr) +{ +/* Set relink_time to 0 */ +rtsx_pci_write_register (pcr,AUTOLOAD_CFG_BASE +1 ,0xFF ,0 ); +rtsx_pci_write_register (pcr,AUTOLOAD_CFG_BASE +2 ,0xFF ,0 ); +rtsx_pci_write_register (pcr,AUTOLOAD_CFG_BASE +3 ,0x01 ,0 ); + +rtsx_pci_write_register (pcr,FPDCTL ,0x03 ,0x03 ); +} +static int rts5249_extra_init_hw (struct rtsx_pcr *pcr) {rtsx_pci_init_cmd (pcr);
@@ -216,6 +226,7 @@ static const struct pcr_ops rts5249_pcr_ops = { .card_power_on = rts5249_card_power_on, .card_power_off = rts5249_card_power_off, .switch_output_voltage = rts5249_switch_output_voltage, + .force_power_down = rts5249_force_power_down, };/* SD Pull Control Enable:
drivers/mfd/rtsx_pcr.c +33 -10
83 lines not on this page · raw message
include/linux/mfd/rtsx_pci.h +10 -0
@@ -520,6 +520,10 @@#define SAMPLE_VAR_CLK0 (0x01 << 4)#define SAMPLE_VAR_CLK1 (0x02 << 4) +/* HOST_SLEEP_STATE */ +#define HOST_ENTER_S1 1 +#define HOST_ENTER_S3 2 +#define MS_CFG 0xFD40#define MS_TPC 0xFD41#define MS_TRANS_CFG 0xFD42
@@ -685,6 +689,11 @@#define AUTOLOAD_CFG_BASE 0xFF00 +#define PM_CTRL1 0xFF44 +#define PM_CTRL2 0xFF45 +#define PM_CTRL3 0xFF46 +#define PM_CTRL4 0xFF47 +/* Memory mapping */ #define SRAM_BASE 0xE600#define RBUF_BASE 0xF400
@@ -754,6 +763,7 @@ struct pcr_ops {unsigned int (*cd_deglitch)(struct rtsx_pcr *pcr);int (*conv_clk_and_div_n)(int clk,int dir);void (*init_settings)(struct rtsx_pcr *pcr); +void (*force_power_down)(struct rtsx_pcr *pcr); };enum PDEV_STAT {PDEV_STAT_IDLE ,PDEV_STAT_RUN };
Signature · 1 line
1.7.9.5
PATCH 3/5 mfd:rtsx: Move some actions from rtsx_pci_init_hw to individual extra_init_hw
In reply to [email protected]From: Wei WANG <[email protected]>
These actions are individual for each reader model, so should be put in extra_init_hw instead of rtsx_pci_init_hw.
--- drivers/mfd/rts5209.c | 4 ++++ drivers/mfd/rts5227.c | 2 ++ drivers/mfd/rts5229.c | 4 ++++ drivers/mfd/rts5249.c | 2 ++ drivers/mfd/rtsx_pcr.c | 4 ---- 5 files changed, 12 insertions(+), 4 deletions(-)
drivers/mfd/rts5209.c +4 -0
@@ -67,6 +67,10 @@ static int rts5209_extra_init_hw(struct rtsx_pcr *pcr)/* Turn off LED */ rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,CARD_GPIO ,0xFF ,0x03 ); +/* Reset ASPM state to default value */ +rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,ASPM_FORCE_CTL ,0x3F ,0 ); +/* Force CLKREQ# PIN to drive 0 to request clock */ +rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,PETXCFG ,0x08 ,0x08 );/* Configure GPIO as output */ rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,CARD_GPIO_DIR ,0xFF ,0x03 );/* Configure driving */
drivers/mfd/rts5227.c +2 -0
@@ -98,6 +98,8 @@ static int rts5227_extra_init_hw(struct rtsx_pcr *pcr)/* Configure GPIO as output */ rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,GPIO_CTL ,0x02 ,0x02 ); +/* Reset ASPM state to default value */ +rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,ASPM_FORCE_CTL ,0x3F ,0 );/* Switch LDO3318 source from DV33 to card_3v3 */ rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,LDO_PWR_SEL ,0x03 ,0x00 );rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,LDO_PWR_SEL ,0x03 ,0x01 );
drivers/mfd/rts5229.c +4 -0
@@ -64,6 +64,10 @@ static int rts5229_extra_init_hw(struct rtsx_pcr *pcr)/* Configure GPIO as output */ rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,GPIO_CTL ,0x02 ,0x02 ); +/* Reset ASPM state to default value */ +rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,ASPM_FORCE_CTL ,0x3F ,0 ); +/* Force CLKREQ# PIN to drive 0 to request clock */ +rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,PETXCFG ,0x08 ,0x08 );/* Switch LDO3318 source from DV33 to card_3v3 */ rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,LDO_PWR_SEL ,0x03 ,0x00 );rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,LDO_PWR_SEL ,0x03 ,0x01 );
drivers/mfd/rts5249.c +2 -0
@@ -103,6 +103,8 @@ static int rts5249_extra_init_hw(struct rtsx_pcr *pcr)/* Configure GPIO as output */ rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,GPIO_CTL ,0x02 ,0x02 ); +/* Reset ASPM state to default value */ +rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,ASPM_FORCE_CTL ,0x3F ,0 );/* Switch LDO3318 source from DV33 to card_3v3 */ rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,LDO_PWR_SEL ,0x03 ,0x00 );rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,LDO_PWR_SEL ,0x03 ,0x01 );
drivers/mfd/rtsx_pcr.c +0 -4
@@ -971,8 +971,6 @@ static int rtsx_pci_init_hw(struct rtsx_pcr *pcr)rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,HOST_SLEEP_STATE ,0x03 ,0x00 );/* Disable card clock */ rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,CARD_CLK_EN ,0x1E ,0 ); -/* Reset ASPM state to default value */ -rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,ASPM_FORCE_CTL ,0x3F ,0 );/* Reset delink mode */ rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,CHANGE_LINK_STATE ,0x0A ,0 );/* Card driving select */
@@ -1002,8 +1000,6 @@ static int rtsx_pci_init_hw(struct rtsx_pcr *pcr)* 0: ELBI interrupt flag[31:22] & [7:0] only can be write clear */ rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,NFTS_TX_CTRL ,0x02 ,0 ); -/* Force CLKREQ# PIN to drive 0 to request clock */ -rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,PETXCFG ,0x08 ,0x08 ); err =rtsx_pci_send_cmd (pcr,100 );if (err <0 )
Signature · 1 line
1.7.9.5
PATCH 4/5 mfd:rtsx: Clear hardware PFM mode in rtl8411b
In reply to [email protected]From: Wei WANG <[email protected]>
Clear hw_pfm_en to disable hardware PFM mode, to fix a bug that in some situation registers in 0xFDxx domain can't be accessed.
--- drivers/mfd/rtl8411.c | 2 ++ include/linux/mfd/rtsx_pci.h | 1 + 2 files changed, 3 insertions(+)
drivers/mfd/rtl8411.c +2 -0
@@ -110,6 +110,8 @@ static int rtl8411b_extra_init_hw(struct rtsx_pcr *pcr) 0xFF, pcr->sd30_drive_sel_3v3);rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,CD_PAD_CTL ,CD_DISABLE_MASK |CD_AUTO_DISABLE ,CD_ENABLE ); +rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,FUNC_FORCE_CTL , +0x06 ,0x00 );return rtsx_pci_send_cmd (pcr,100 ); }
include/linux/mfd/rtsx_pci.h +1 -0
@@ -672,6 +672,7 @@#define PME_FORCE_CTL 0xFE56#define ASPM_FORCE_CTL 0xFE57#define PM_CLK_FORCE_CTL 0xFE58 +#define FUNC_FORCE_CTL 0xFE59#define PERST_GLITCH_WIDTH 0xFE5C#define CHANGE_LINK_STATE 0xFE5B#define RESET_LOAD_REG 0xFE5E
Signature · 1 line
1.7.9.5
PATCH 5/5 mfd:rtsx: Configure to enter a deeper power-saving mode in S3
In reply to [email protected]From: Wei WANG <[email protected]>
Set a bit to enable rts5227 and rts5249 to enter a deeper internal power-saving mode in S3, and recover it after resuming.
--- drivers/mfd/rtl8411.c | 2 +- drivers/mfd/rts5209.c | 2 +- drivers/mfd/rts5227.c | 6 +++++- drivers/mfd/rts5229.c | 2 +- drivers/mfd/rts5249.c | 6 +++++- drivers/mfd/rtsx_pcr.c | 2 +- include/linux/mfd/rtsx_pci.h | 5 ++--- 7 files changed, 16 insertions(+), 9 deletions(-)
drivers/mfd/rtl8411.c +1 -1
@@ -82,7 +82,7 @@ static void rtl8411b_init_settings(struct rtsx_pcr *pcr) } } -static void rtl8411_force_power_down (struct rtsx_pcr *pcr) +static void rtl8411_force_power_down (struct rtsx_pcr *pcr,u8 pm_state) {rtsx_pci_write_register (pcr,FPDCTL ,0x07 ,0x07 ); }
drivers/mfd/rts5209.c +1 -1
@@ -56,7 +56,7 @@ static void rts5209_init_settings(struct rtsx_pcr *pcr) } } -static void rts5209_force_power_down (struct rtsx_pcr *pcr) +static void rts5209_force_power_down (struct rtsx_pcr *pcr,u8 pm_state) {rtsx_pci_write_register (pcr,FPDCTL ,0x07 ,0x07 ); }
drivers/mfd/rts5227.c +5 -1
@@ -80,13 +80,16 @@ static void rts5227_init_settings(struct rtsx_pcr *pcr) } } -static void rts5227_force_power_down (struct rtsx_pcr *pcr) +static void rts5227_force_power_down (struct rtsx_pcr *pcr,u8 pm_state) {/* Set relink_time to 0 */ rtsx_pci_write_register (pcr,AUTOLOAD_CFG_BASE +1 ,0xFF ,0 );rtsx_pci_write_register (pcr,AUTOLOAD_CFG_BASE +2 ,0xFF ,0 );rtsx_pci_write_register (pcr,AUTOLOAD_CFG_BASE +3 ,0x01 ,0 ); +if (pm_state ==HOST_ENTER_S3 ) +rtsx_pci_write_register (pcr,PM_CTRL3 ,0x10 ,0x10 ); +rtsx_pci_write_register (pcr,FPDCTL ,0x03 ,0x03 ); }
@@ -120,6 +123,7 @@ static int rts5227_extra_init_hw(struct rtsx_pcr *pcr)else rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,AUTOLOAD_CFG_BASE +3 ,0xB8 ,0x88 ); +rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,PM_CTRL3 ,0x10 ,0x00 );return rtsx_pci_send_cmd (pcr,100 ); }
drivers/mfd/rts5229.c +1 -1
@@ -53,7 +53,7 @@ static void rts5229_init_settings(struct rtsx_pcr *pcr) } } -static void rts5229_force_power_down (struct rtsx_pcr *pcr) +static void rts5229_force_power_down (struct rtsx_pcr *pcr,u8 pm_state) {rtsx_pci_write_register (pcr,FPDCTL ,0x03 ,0x03 ); }
drivers/mfd/rts5249.c +5 -1
@@ -87,13 +87,16 @@ static void rts5249_init_settings(struct rtsx_pcr *pcr) } } -static void rts5249_force_power_down (struct rtsx_pcr *pcr) +static void rts5249_force_power_down (struct rtsx_pcr *pcr,u8 pm_state) {/* Set relink_time to 0 */ rtsx_pci_write_register (pcr,AUTOLOAD_CFG_BASE +1 ,0xFF ,0 );rtsx_pci_write_register (pcr,AUTOLOAD_CFG_BASE +2 ,0xFF ,0 );rtsx_pci_write_register (pcr,AUTOLOAD_CFG_BASE +3 ,0x01 ,0 ); +if (pm_state ==HOST_ENTER_S3 ) +rtsx_pci_write_register (pcr,PM_CTRL3 ,0x10 ,0x10 ); +rtsx_pci_write_register (pcr,FPDCTL ,0x03 ,0x03 ); }
@@ -118,6 +121,7 @@ static int rts5249_extra_init_hw(struct rtsx_pcr *pcr)else rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,AUTOLOAD_CFG_BASE +3 ,0xB0 ,0x80 ); +rtsx_pci_add_cmd (pcr,WRITE_REG_CMD ,PM_CTRL3 ,0x10 ,0x00 );return rtsx_pci_send_cmd (pcr,100 ); }
drivers/mfd/rtsx_pcr.c +1 -1
@@ -938,7 +938,7 @@ static void rtsx_pci_power_off(struct rtsx_pcr *pcr, u8 pm_state)rtsx_pci_write_register (pcr,HOST_SLEEP_STATE ,0x03 , pm_state);if (pcr->ops->force_power_down) - pcr->ops->force_power_down (pcr); + pcr->ops->force_power_down (pcr, pm_state); }static int rtsx_pci_init_hw (struct rtsx_pcr *pcr)
include/linux/mfd/rtsx_pci.h +2 -3
@@ -24,8 +24,7 @@#include <linux/sched.h> #include <linux/pci.h> - -#include "rtsx_common.h" +#include <linux/mfd/rtsx_common.h> #define MAX_RW_REG_CNT 1024
@@ -764,7 +763,7 @@ struct pcr_ops {unsigned int (*cd_deglitch)(struct rtsx_pcr *pcr);int (*conv_clk_and_div_n)(int clk,int dir);void (*init_settings)(struct rtsx_pcr *pcr); -void (*force_power_down)(struct rtsx_pcr *pcr); +void (*force_power_down)(struct rtsx_pcr *pcr,u8 pm_state); };enum PDEV_STAT {PDEV_STAT_IDLE ,PDEV_STAT_RUN };
Signature · 1 line
1.7.9.5